POSIX日期时间的奇怪行为

时间:2016-09-26 18:11:18

标签: r date posix posixct

POSIX对象的这种行为让我感到困惑。我制作两个POSIX日期时间向量,一个POSIXct和其他POSIXlt,它们具有相同的日期和时间。它们相同==但不是%in%,如下所示。

d.ch = c("2016-09-26 0:00:00", "2016-09-26 1:00:00", "2016-09-26 2:00:00", "2016-09-26 3:00:00", "2016-09-26 4:00:00")
d1 = strptime(d.ch, format="%Y-%m-%d %H:%M:%S") # POSIXlt
d3 = seq(from=ISOdatetime(2016,9,26,0,0,0), 
     length.out=5, by="hour") # POSIXct
d1 == d3
[1] TRUE TRUE TRUE TRUE TRUE

d1 %in% d3
[1] FALSE FALSE FALSE FALSE FALSE

为什么?

2 个答案:

答案 0 :(得分:2)

如果您只是将strptime()结果转换为POSIXct,那么一切正常。

或者,如果您使用anytime(),默认情况下也会创建POSIXct

R> library(anytime)
R> d1 <- anytime(c("2016-09-26 00:00:00", "2016-09-26 01:00:00", 
+  "2016-09-26 02:00:00", "2016-09-26 03:00:00", "2016-09-26 04:00:00"))
R> d1
[1] "2016-09-26 00:00:00 CDT" "2016-09-26 01:00:00 CDT" "2016-09-26 02:00:00 CDT" 
[4] "2016-09-26 03:00:00 CDT" "2016-09-26 04:00:00 CDT"
R> d3 <- seq(from=ISOdatetime(2016,9,26,0,0,0), length.out=5, by="hour") # POSIXct
R> d3
[1] "2016-09-26 00:00:00 CDT" "2016-09-26 01:00:00 CDT" "2016-09-26 02:00:00 CDT" 
[4] "2016-09-26 03:00:00 CDT" "2016-09-26 04:00:00 CDT"
R> d1 == d3
[1] TRUE TRUE TRUE TRUE TRUE
R> d1 %in% d3
[1] TRUE TRUE TRUE TRUE TRUE
R> 

因为anytime()遍历一组预编码格式,我不得不为你的小时格式添加一个零,使其像普通的ISOtime格式一样。

(哦,CDT恰好是我的时区。)

答案 1 :(得分:2)

POSIXctPOSIXlt都继承自虚拟POSIXt类。这就是允许==+-等二元运算符在一个对象为POSIXct而另一个为POSIXlt时工作的原因。这些二元函数查看它们的参数类。

%in%调用match,它会从表中查找值。没有S3方法调度来利用POSIXt虚拟类,因此您得到FALSE的向量。