lubridate解析一天休息的日期

卡马约

当我放置一个要解析的日期时,它可以准确地解析

> ymd("20011001")
[1] "2001-10-01 UTC"

但是,当我尝试创建日期向量时,它们都会在一天之内全部消失:

> b=c(ymd("20111001"),ymd("20101001"),ymd("20091001"),ymd("20081001"),ymd("20071001"),ymd("20061001"),ymd("20051001"),ymd("20041001"),ymd("20031001"),ymd("20021001"),ymd("20011001"))
> b
 [1] "2011-09-30 19:00:00 CDT" "2010-09-30 19:00:00 CDT" "2009-09-30 19:00:00 CDT"
 [4] "2008-09-30 19:00:00 CDT" "2007-09-30 19:00:00 CDT" "2006-09-30 19:00:00 CDT"
 [7] "2005-09-30 19:00:00 CDT" "2004-09-30 19:00:00 CDT" "2003-09-30 19:00:00 CDT"
[10] "2002-09-30 19:00:00 CDT" "2001-09-30 19:00:00 CDT"

我怎样才能解决这个问题???非常感谢。

本·博克(Ben Bolker)

我并没有声称要确切了解发生了什么,但是最接近的问题是c()剥离了属性,因此c()在POSIX [c?] t向量上使用 会将其从UTC更改为您的语言环境指定的时区, 剥离时区属性,将其弄乱(即使您将时区设置为与您的语言环境指定的时区一致)。在我的系统上:

library(lubridate)
(y1 <- ymd("20011001"))
## [1] "2001-10-01 UTC"
(y2 <- ymd("20011002"))
c(y1,y2)
## now in EDT (and a day earlier/4 hours before UTC):
## [1] "2001-09-30 20:00:00 EDT" "2001-10-01 20:00:00 EDT"
(y12 <- ymd(c("20011001","20011002")))
## [1] "2001-10-01 UTC" "2001-10-02 UTC"
c(y12)
## back in EDT
## [1] "2001-09-30 20:00:00 EDT" "2001-10-01 20:00:00 EDT"

您可以显式设置时区...

y3 <- ymd("20011001",tz="EDT")
## [1] "2001-10-01 EDT"

但是c()还是有问题的。

(y3c <- c(y3))
## [1] "2001-09-30 20:00:00 EDT"

所以有两个解决方案

  • 转换字符向量,而不是在将它们一一转换后组合对象,或者
  • tzone合并后恢复属性。

例如:

 attr(y3c,"tzone") <- attr(y3,"tzone")

@Joran指出,这是几乎可以肯定将的一般性质c(),以POSIX[c?]t对象,没有特别lubridate-相关。我希望有人能插话并解释这是否是众所周知的设计决策/模糊/功能不当。

更新2012年在R-help上对此进行了一些讨论,Brian Ripley评论:

但是无论如何,文档(?c.POSIXct)很清楚:

  Using ‘c’ on ‘"POSIXlt"’ objects converts them to the current time
  zone, and on ‘"POSIXct"’ objects drops any ‘"tzone"’ attributes
  (even if they are all marked with the same time zone).

因此,建议的方法是添加一个“ tzone”属性(如果您知道所需的属性)。POSIXct对象是绝对时间:时区仅影响它们的转换方式(包括转换为打印字符)。

如果lubridate添加一种方法来执行此操作可能会很好...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章