我有一个大型数据集的日期时间,一年中的每一秒都差不多整整一年。我正在尝试dplyr::left_join
第二个数据集,该数据集的日期时间列的值在第一个数据集的时间范围内。当我加入数据集时,只有少量记录加入(约为45k的约100个),我知道大多数记录应该加入。我正在做的确保列相同的检查包括:
dput(df_all_dates$date_time[1])
dput(df_subset_dates$date_time[1])
这两个产生以下内容:
structure(1485781200, class = c("POSIXct", "POSIXt"), tzone = "")
我还做了以下比较(以下代码中的10
和4701
反映了数据中的相同日期:
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')
答案 0 :(得分:1)
这有点傻,但我发现了问题 - 其中一些dttm包含了毫秒。除了使用dput()的几个示例之外,我无法在任何地方看到它们。一旦我删除了这些,数据就可以了。
答案 1 :(得分:0)
在我单独的数据集上,检查''使用lubridate :: seconds(date_time)的列显示它们的格式因毫秒而有所不同,尽管它并没有显示在大多数显示中。 " 1522267608S" vs" 1522267308.443S" (这些不应该匹配,只是为了显示格式)
包装以下一列或两列以删除毫秒为我做了诀窍:
library(lubridate)
as_datetime(floor(seconds(date_time)))
我还没有对其他案例进行过广泛测试,但是floor()完全适用于我的数据。可能是round()或ceiling()适用于其他人。