lubridate:读取日期时间对象时去除毫秒数

lubridate: Strip milliseconds when reading datetime objects

我有这样的情况,日期是这样写的,以毫秒为单位:

2021/03/04 11:15:19.000
2021/03/04 11:15:19.999

我使用 lubridate 将它们转换为日期时间,它们看起来不错并且完全一样:

> library(lubridate)
> as_datetime("2021/03/04 11:15:19.000")
[1] "2021-03-04 11:15:19 UTC"
> as_datetime("2021/03/04 11:15:19.999")
[1] "2021-03-04 11:15:19 UTC"

但是,当我比较它们时,它们并不等同:

> as_datetime("2021/03/04 11:15:19.000") == as_datetime("2021/03/04 11:15:19.999")
[1] FALSE

但如果是简单的日期,它们是:

> as_date("2021/03/04 11:15:19.000") == as_date("2021/03/04 11:15:19.999")
[1] TRUE

这给我的工作流程带来了问题。排除故障特别困难,因为无法显示毫秒,仅查看处理的日期时无法知道毫秒是否不同。有没有办法让它们读作等效的日期时间?

我最好的解决方法是转换为字符,因为它们在字符形式上是等价的:

> as.character(as_datetime("2021/03/04 11:15:19.000")) == 
  as.character(as_datetime("2021/03/04 11:15:19.999"))
[1] TRUE

由此我们可以再次转换为日期时间:

> as_datetime(as.character(as_datetime("2021/03/04 11:15:19.000"))) ==
  as_datetime(as.character(as_datetime("2021/03/04 11:15:19.999")))
[1] TRUE

但是这个解决方案看起来真的很费解。当然有更简洁的方法来做到这一点?

R 将日期时间对象存储为 double,计算自纪元(即 1970 年 1 月 1 日)以来的小数秒。请注意,我们说的是小数秒。当您阅读它们时,您的两个观察结果 不同的,因此 R 告诉您它们不相等是非常正确的。

但是转换为 Date(这是 的计数,而不是自纪元以来的秒数),您正在进行有损转换。更简单的方法是 trunc()。正如@akrun 和@Dave2e 在上面的评论中暗示的那样,none 这与 lubridate 有任何关系——这就是 R 做生意的方式。

> d1 <- as.POSIXct("2021/03/04 11:15:19.000")
> d2 <- as.POSIXct("2021/03/04 11:15:19.999")
> d1 == d2
[1] FALSE
> trunc(d1) == trunc(d2)
[1] TRUE
>