R 如何在日期时间对象中存储毫秒数?

How does R store Milliseconds in a Date-Time Object?

我只是有点好奇 R 如何在日期时间对象中存储毫秒数,因为当我尝试查看日期时间对象的一些属性时会发生一些奇怪的事情。

假设我有一个日期时间对象如下:

 t1<- as.POSIXct("2007-05-04 16:04:53.912", format = "%Y-%m-%d %H:%M:%OS") + 1e-6

 t2<- as.POSIXct("2007-05-04 16:04:53.911", format = "%Y-%m-%d %H:%M:%OS") + 1e-6

现在,如果我要检查:

 t1 == t2

然后R输出FALSE,因为t1t2之间的毫秒值彼此不同。

然而,如果我现在写 as.numeric(t1)as.numeric(t2) 那么我得到它们的数字 1178258694,但是如果我改为写 as.numeric(t1) == as.numeric(t2) 那么 R 仍然输出 FALSE 尽管我得到了两个日期时间对象的数字 1178258694

同样,如果我使用下面的代码将它转换为 xts 对象

 t3 <- c(t1,t2)
 v6 <- data.frame(t3,v5)
 v7 <- xts(v6,order.by=t3)

然后如果我现在写 .index(v7)[1] == .index(v7)[2] 我会得到完全相同的结果。

谁能告诉我为什么,尽管 as.numeric(t1) 等于 1178258694as.numeric(t2) 等于 1178258694,但 as.numeric(t1) 不等于 as.numeric(t2)?

编辑:我问的主要是因为我想使用日期时间对象的数值执行 'check' 因为与标准日期时间对象相比,R 似乎更有效地处理这些值

来自 R documentation

Date-Time class POSIXct represents the number of seconds since the beginning of 1970 as a numeric vector

关键部分是使用数字向量,它允许十进制表示。尝试以不同的格式打印 t1 或 t2,您将看到它是一个实际数字。

sprintf("%f", t1) #[1] "1178319893.912001"
sprintf("%f", t2) #[1] "1178319893.911001"

您在 as.numeric 中看到的只是它吐出的格式。您可以像上面一样打印 as.numeric(t1) 的结果,它也会显示小数。