【问题标题】:lubridate: Strip milliseconds when reading datetime objectslubridate:读取日期时间对象时去除毫秒
【发布时间】:2022-01-29 20:31:33
【问题描述】:

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

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

但这个解决方案似乎真的很复杂。当然有更清洁的方法来做到这一点?

【问题讨论】:

  • 检查strftimeformat,毫秒精度已经存在,但未打印,即strftime(as_datetime("2021/03/04 11:15:19.000"), "%OS3") [1] "19.000"; > strftime(as_datetime("2021/03/04 11:15:19.999"), "%OS3") [1] "19.999"
  • 跳过 lubridate 函数,使用 base R 定义时间转换:as.POSIXct(yourdates, "%Y/%m/%d %H:%M:%S", tz="")

标签: r datetime lubridate milliseconds


【解决方案1】:

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

但是转换为Date(这是的计数,而不是自纪元以来的秒数),您正在进行有损转换。更简单的方法是trunc()。正如@akrun 和@Dave2e 在上面的 cmets 中所暗示的,这一切都与 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
> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-20
    • 2017-02-14
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多