簡體   English   中英

使用日期時間列的dplyr :: left_join無法正確連接

[英]r dplyr::left_join using datetime columns does not join properly

我有一個很大的日期時間數據集,幾乎是一年中的每一秒鍾。 我正在嘗試dplyr::left_join第二個數據集,該數據集的datetime列的值在第一個數據集中的時間范圍內。 當我加入數據集時,只有少數記錄(約45k中的約100條)加入,並且我知道大多數記錄都應該加入。 我為確保各列相同所做的檢查包括:

dput(df_all_dates$date_time[1])
dput(df_subset_dates$date_time[1])

兩者都會產生以下結果:

structure(1485781200, class = c("POSIXct", "POSIXt"), tzone = "")

我還做了以下比較(以下代碼中的104701反映了數據中的相同日期):

as.numeric(df_all_dates$date_time[10]) # produces value 1485785900
as.numeric(df_subset_dates$date_time[4701]) # produces value 1485785900

但是,在聯接中,即使datetime值相同,來自df_subset_dates的數據也不會聯接到結果數據集中。 關於日期時間還有其他事情會導致它們不加入嗎? 有些值確實可以連接,但是我看不出為什么那些記錄與未連接的記錄不同的任何模式。

如果有幫助,以下是實際聯接的代碼:

df_all_dates %>%
 left_join(df_subset_dates, by = 'date_time')

這有點愚蠢,但是我發現了問題-其中一些dttm包含了毫秒。 除了在使用dput()的幾個示例中,我在任何地方都看不到它們。 一旦刪除了這些,數據就可以正常工作了。

在我單獨的數據集上,用lubridate :: seconds(date_time)檢查兩個“ by”列,發現它們的格式設置因毫秒不同而有差異,盡管大多數顯示中都沒有。 “ 1522267608S”與“ 1522267308.443S”(這些不應該匹配,只是為了顯示格式)

在下面包裝一列或兩列以除去毫秒對我來說是個竅門:

library(lubridate)
as_datetime(floor(seconds(date_time)))

我還沒有廣泛測試其他情況,但是floor()對於我的數據非常有效。 round()或ceiling()可能對其他人有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM