R POSIX日期时间的奇怪行为
POSIX对象的这种行为让我感到困惑。我创建了两个POSIX日期时间向量,一个是POSIXct,另一个是POSIXlt,它们具有相同的日期和时间。它们在%中的R POSIX日期时间的奇怪行为,r,date,posix,posixct,R,Date,Posix,Posixct,POSIX对象的这种行为让我感到困惑。我创建了两个POSIX日期时间向量,一个是POSIXct,另一个是POSIXlt,它们具有相同的日期和时间。它们在%中的==方面相同,但在%中的%方面不同,如下所示 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="%
==
方面相同,但在%中的%方面不同,如下所示
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
但是
为什么?只要将strtime()
结果转换为POSIXct
就可以了
或者如果您使用默认情况下也会创建POSIXct
的anytime()
:
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>
R>库(随时)
R> 首被告
[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 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] 真的真的真的
R> d1%在%d3中
[1] 真的真的真的
R>
因为anytime()
迭代一组预先编码的格式,所以我必须在小时格式中添加一个零,使其与常规的等时格式类似
(哦,CDT正好是我的时区。)如果您只需将strtime()
结果转换为POSIXct
,这一切都可以实现
或者如果您使用默认情况下也会创建POSIXct
的anytime()
:
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>
R>库(随时)
R> 首被告
[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 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] 真的真的真的
R> d1%在%d3中
[1] 真的真的真的
R>
因为anytime()
迭代一组预先编码的格式,所以我必须在小时格式中添加一个零,使其与常规的等时格式类似
(哦,CDT正好是我的时区。)这两个POSIXct
和POSIXlt
都继承自虚拟POSIXt
类。这就是当一个对象是POSIXct
而另一个对象是POSIXlt
时,允许诸如==
、+
、-
等二进制运算符工作的原因。这些二进制函数查看其参数的类
%in%
调用match
,它从表中查找值。没有S3方法调度来利用POSIXt
虚拟类,因此您得到了FALSE
向量POSIXct
和POSIXlt
都继承自虚拟POSIXt
类。这就是当一个对象是POSIXct
而另一个对象是POSIXlt
时,允许诸如==
、+
、-
等二进制运算符工作的原因。这些二进制函数查看其参数的类
%in%
调用match
,它从表中查找值。没有S3方法调度来利用POSIXt
虚拟类,因此得到的向量FALSE
d1
似乎是POSIXlt,而d3似乎是POSIXct。可能=
正在执行一些隐式强制。请查看属性(d1)
和属性(d3)
。POSIXlt
类与列表的共同点大于与向量的共同点。事实上,我的理解是,这就是POSIXlt`中的l
所代表的,而POSIXct
中的c
是对用于生成向量的c
函数的引用。(我相信还有一个更技术性的解释)您可以调查lubridate
作为替代方案。它使许多日期/时间对象保持一致。d1
似乎是POSIXlt,而d3似乎是POSIXct。可能=
正在执行一些隐式强制。请查看属性(d1)
和属性(d3)
。POSIXlt
类与列表的共同点大于与向量的共同点。事实上,我的理解是,这就是POSIXlt`中的l
所代表的,而POSIXct
中的c
是对用于生成向量的c
函数的引用。(我相信还有一个更技术性的解释)您可以调查lubridate
作为替代方案。它使许多日期/时间对象保持一致。感谢您随时建议
,效果非常好。但这似乎告诉我POSIXlt和POSIXct并不真正兼容,这是一个讽刺。不,这不是一个好的方式来看待它——阅读帮助(DateTimeClass)
。我认为POSIXlt
是一种列表类型,允许我访问组件,和POSIXct
作为紧凑型,适用于data.frames或xts索引等中的单列。它们是相同基础信息的不同表示形式,但由于它们在设计上不同,您无法完成您在问题中尝试的操作。我刚刚发布了另一个问题,以寻求何时使用哪种方法的指导日期时间类型。你能详细解释一下POSIX的语义吗?你甚至还没有接受这个,现在还指望我按需“跳”到另一个吗?哦,我看到了另一个,并且是关闭它的人之一。你的前提是错误的,我需要重复我的建议去阅读help(DateTimeClasses)
。R真的是一个很好的工具,虽然文档可能很密集,但它会给你带来回报的。感谢你随时建议
,效果很好。但这似乎告诉我POSIXlt和POSIXct并不真正兼容,这是一个讽刺。不,这不是一个好的方式来看待它——阅读帮助(DateTimeClass)
。我认为POSIXlt
是一种列表类型,允许我访问组件,POSIXct
是一种紧凑类型,适用于data.frames或xts索引等中的单列。它们是dif