POSIX 日期时间的奇怪行为
strange behavior of POSIX date-times
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
为什么?
只要将 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 正好是我的时区。)
POSIXct
和POSIXlt
都继承自虚拟POSIXt
class。这就是允许像 ==
、+
、-
等二元运算符在一个对象为 POSIXct
而另一个对象为 POSIXlt
时起作用的原因。这些二元函数查看它们参数的 class。
%in%
调用 match
,它从 table 中查找值。没有 S3 方法调度来利用 POSIXt
虚拟 class,所以你得到一个 FALSE
.
的向量
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
为什么?
只要将 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 正好是我的时区。)
POSIXct
和POSIXlt
都继承自虚拟POSIXt
class。这就是允许像 ==
、+
、-
等二元运算符在一个对象为 POSIXct
而另一个对象为 POSIXlt
时起作用的原因。这些二元函数查看它们参数的 class。
%in%
调用 match
,它从 table 中查找值。没有 S3 方法调度来利用 POSIXt
虚拟 class,所以你得到一个 FALSE
.