【问题标题】:r dplyr::left_join using datetime columns does not join properlyr dplyr::left_join 使用日期时间列未正确连接
【发布时间】:2018-02-16 15:01:29
【问题描述】:

我有一个大的日期时间数据集,几乎一年中的每一秒。我正在尝试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

但是,在连接中,来自 df_subset_dates 的数据不会连接到结果数据集中,即使日期时间值相同。关于日期时间还有其他什么会导致这些不加入吗?有些值确实加入了,但我看不出任何模式来说明为什么这些记录与未加入的记录不同。

如果有帮助,这里是实际连接的代码:

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

【问题讨论】:

  • 请附上一个可重现的例子
  • 我在过去加入日期时遇到过问题...与您在此处描述的不太一样,但我会将它们转换为数字,加入并转换回来。如果没有更详细的示例,就很难诊断。
  • 如果 OP 可以制作一个可重现的示例,他们就会知道解决方案!我发现问题和答案很有帮助。将日期更改为数字并没有显示任何直接问题。我在两个日期都使用了 lubridate::seconds() 并发现 jstauss 的答案很有帮助。

标签: r datetime join dplyr


【解决方案1】:

在我的单独数据集上,使用 lubridate::seconds(date_time) 检查两个 'by' 列显示它们的格式因毫秒而异,尽管它没有出现在大多数显示器中。 “1522267608S”与“1522267308.443S”(这些不应该匹配,只是为了显示格式)

包装下面的一列或两列以删除毫秒对我来说是诀窍:

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

我没有对其他情况进行广泛的测试,但是 floor() 对我的数据非常有效。可能是 round() 或 ceiling() 对其他人有效。

【讨论】:

  • 就是这样。感谢您的回复!
【解决方案2】:

这有点傻,但我发现了问题 - 一些 dttm 包含毫秒。除了使用 dput() 的几个示例之外,我在任何地方都看不到它们。一旦我删除了这些,数据就可以正常连接了。

【讨论】:

  • 使用 lubridate::seconds(),我发现一列显示类似“1522267608S”的结果,另一列显示类似“1522267308.443S”的结果(这两个不应该匹配,只是一个格式示例) .看到相同问题的不同方式。
猜你喜欢
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多