使用datetime列的r dplyr :: left_join无法正常连接

时间:2018-02-16 15:01:29

标签: r datetime join dplyr

我有一个大型数据集的日期时间,一年中的每一秒都差不多整整一年。我正在尝试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 = "")

我还做了以下比较(以下代码中的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')

2 个答案:

答案 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()适用于其他人。