【问题标题】:strange behavior of POSIX date-timesPOSIX 日期时间的奇怪行为
【发布时间】:2016-09-26 18:11:17
【问题描述】:

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

为什么?

【问题讨论】:

  • d1 似乎是 POSIXlt,而 d3 似乎是 POSIXct。可能== 正在做一些隐含的强制。
  • 看看attributes(d1)attributes(d3)POSIXlt 类与列表的共同点比与向量的共同点要多。事实上,我的理解是 POSIXlt` 中的 l 所代表的含义,而 POSIXct 中的 c 是对用于制作向量的 c 函数的引用。 (我敢肯定还有更技术性的解释)
  • 您可以调查lubridate 作为替代方案。它使许多日期/时间对象保持一致。

标签: r date posix posixct


【解决方案1】:

如果您只需将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 恰好是我的时区。)

【讨论】:

  • 感谢anytime 的建议,效果很好。但这似乎在告诉我 POSIXlt 和 POSIXct 并不真正兼容,这是一种讽刺。
  • 不,这不是一个很好的看待它的方式——阅读help(DateTimeClasses)。我认为POSIXlt 是一个 list 类型 让我可以访问组件,POSIXct 作为 compact 类型 适用于 data.frames 或 xts 索引等中的单个列. 它们是相同基础信息的不同表示,但由于它们设计不同,因此您无法执行您在问题中尝试的操作。
  • 我刚刚在 SO 上发布了另一个问题,寻求有关何时使用哪种日期时间类型的指导。您能否详细说明一下 POSIX 的语义。
  • 你还没有接受这个,现在还指望我按需“跳”到另一个?
  • 哦,我看到了另一个,并且是关闭它的人之一。你的前提是错误的,我需要重申我的建议去阅读help(DateTimeClasses)。 R 真的很好,虽然文档可能很密集,但它会以利息回报您。
【解决方案2】:

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

%in% 调用match,它从表中查找值。没有 S3 方法调度来利用 POSIXt 虚拟类,所以你得到一个 FALSE 的向量。

【讨论】:

  • 是否计划添加 S3 方法以使 matchPOSIXt 类上工作?
  • 询问 R-core。只有他们会知道。
猜你喜欢
  • 2014-11-23
  • 1970-01-01
  • 2019-11-30
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 2013-02-21
相关资源
最近更新 更多