lubridate解析约会一天

时间:2013-12-31 21:11:31

标签: r 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"

我该如何解决这个问题?非常感谢。

1 个答案:

答案 0 :(得分:7)

我没有声称要确切了解这里发生了什么,但近端问题是c()剥离属性,因此在POSIX [c?] t向量上使用c()更改从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个相关的对象。我希望有人会插手并解释这是一个众所周知的设计决定/不合理/错误。

更新:对此on R-help in 2012进行了一些讨论,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添加了一个方法来执行此操作,那可能会很好......