为什么我的日期在 R 中看起来相同时不等效?

Why are my dates not equivalent in R when they look identical?

提问人:DJD 提问时间:9/27/2022 更新时间:9/27/2022 访问量:123

问:

我在 R 中有两个日期 - 它们是通过使用 lubridate::floor_date 将其他日期四舍五入到最接近的月份开始创建的

它们在各种测试下看起来都一样......例如:

ymd(changes3$M[32]) [1] "2020-08-01" ymd(changes3$M[33]) [1] "2022-08-01"

如。POSIXct(changes3$M[33]) [1] “2022-08-01 01:00:00 BST” 如。POSIXct(changes3$M[32]) [1] “2020-08-01 01:00:00 BST”

但我不能让它们表现得等效,例如

changes3$M[32]==changes3$M[33] [1] 假

如。POSIXct(changes3$M[32])==as.POSIXct(changes3$M[33]) [1] 假

round_date(如。POSIXct(changes3$M[32],day))==round_date(as.POSIXct(changes3$M[33],day)) [1] 假

format(changes3$M[33],“%Y%M”)==format(changes3$M[32],“%Y%M”) [1] 假

可能出了什么问题?当我对它们进行测试时,这些方法工作正常 例如:

如。POSIXct(changes3$M[32])==as.POSIXct(changes3$M[32]) [1] 真

  • 所以我假设它是隐藏在日期格式中的东西,我无法发现?
r 日期 比较

评论


答:

2赞 Dirk Eddelbuettel 9/27/2022 #1

这是 R FAQ 7.31 的变体,因为日期时间对象实际上是浮点值。格式化显示相等这一事实仅意味着 你(隐式地)截断了——你需要让它隐式截断。

> now <- Sys.time(); notnow <- Sys.time()  # so microseconds apart
> format(now) == format(notnow)            # "looks the same"
[1] TRUE
> trunc(now) == trunc(notnow)              # "equal if truncated"
[1] TRUE
> round(now) == round(notnow)              # "equal if rounded"
[1] TRUE
> 
> now == notnow                            # but not equal numerically
[1] FALSE
> 

虽然这可能有点烦人,但它实际上是一个功能,因为它提供了一些高精度的日期和时间比较。

评论

0赞 DJD 9/27/2022
好的,谢谢。。。。那么下一个问题是,当您演示的 trunc() 和 round() 选项不起作用时,我如何将它们视为等效的......例如> trunc(changes3$M[33])==trunc(changes3$M[32]) [1] FALSE > round(changes3$M[33])==round(changes3$M[32]) [1] FALSE 另外 - 当我使用 lubridate::floor_date() 创建这些日期并将单位参数设置为“月”时,我本来可以想象同一月中任何日期的地板都会完全相同
0赞 DJD 9/28/2022
费用3[,M:=floor_date(d,unit=“月”)]
0赞 Dirk Eddelbuettel 9/28/2022
您的示例不可重现,因为我们没有您的数据,但您似乎需要决定您希望或不希望相等的粒度,然后相应地舍入或截断。