2012-07-26 27 views
4

考虑POSIXct日期名单:如果我做范围POSIXct的名单日期

times <- list(as.POSIXct(c("2012-07-26 00:30", "2012-07-26 6:20", 
          "2012-07-26 10:40", "2012-07-26 15:50")), 
       as.POSIXct(c("2012-07-26 01:15", "2012-07-26 10:10", 
          "2012-07-26 15:15", "2012-07-26 18:50")), 
       as.POSIXct(c("2012-07-26 00:35", "2012-07-26 15:05", 
          "2012-07-26 19:36", "2012-07-26 22:32")), 
       as.POSIXct(c("2012-07-26 03:34", "2012-07-26 16:43", 
          "2012-07-26 21:44", "2012-07-26 23:45"))) 

range(times[[1]]) 

我正确地得到:

[1] "2012-07-26 00:30:00 CEST" "2012-07-26 15:50:00 CEST" 

现在,如果我这样做:

range(times[c(1,3)]) 

不管出于什么原因[R决定转换POSIXct对象转换成时间戳,给我

[1] 1343255400 1343334720 

然后我试着做他们再转换成POSIXct:

as.POSIXct(range(times[c(1,3)]), origin="1970-01-01 00:00") 

而且,奇怪的是,我得到的范围1小时前的:

[1] "2012-07-25 23:30:00 CEST" "2012-07-26 21:32:00 CEST" 

所以我必须做的:

as.POSIXct(range(times[c(1,3)]), origin="1970-01-01 01:00") 

为了得到正确的范围:

[1] "2012-07-26 00:30:00 CEST" "2012-07-26 22:32:00 CEST" 

我缺少的东西或者是有错误的地方?

回答

4

times[[1]]是一个向量,而times[c(1,3)]是一个列表。在调用range之前将后者转换为矢量,并且一切正常。

你不想使用unlist虽然,因为它只会返回(range必须做这样的事情是内部)的原子向量,但您可以使用do.call

range(do.call(c,times[c(1,3)])) 

你得到的差异从使用as.POSIXct可能是由于时区问题。

+2

快速查看'range.default'确认它首先在它的参数上调用'c(...,recursive = TRUE)'。 – joran 2012-07-26 14:19:49

+0

谢谢,这很有道理 – nico 2012-07-26 14:32:16

2

正如约书亚所说,小时是因为时区。尝试,例如:

times <- list(as.POSIXct(c("2012-07-26 00:30", "2012-07-26 6:20", 
         "2012-07-26 10:40", "2012-07-26 15:50"), "GMT"), 
      as.POSIXct(c("2012-07-26 01:15", "2012-07-26 10:10", 
         "2012-07-26 15:15", "2012-07-26 18:50"), "GMT"), 
      as.POSIXct(c("2012-07-26 00:35", "2012-07-26 15:05", 
         "2012-07-26 19:36", "2012-07-26 22:32"), "GMT"), 
      as.POSIXct(c("2012-07-26 03:34", "2012-07-26 16:43", 
         "2012-07-26 21:44", "2012-07-26 23:45"), "GMT")) 
as.POSIXct(range(times[c(1,3)]), origin="1970-01-01 00:00", "GMT") 
+0

感谢你太爱德华。 – nico 2012-07-26 14:32:29

+0

如果你想使用CEST日期,你也可以改变你的环境的日期,而不是:'Sys.setenv(TZ ='CEST')'。 – Pop 2012-07-26 14:35:58

+0

当我这样做时,在尝试创建时间后,我收到以下警告:'警告消息: 在strptime(xx,f < - “%Y-%m-%d%H:%M:%OS”中,tz = tz): 未知的时区'CEST''。这是我的R安装问题吗(或者我需要额外的软件包)? – Edward 2012-07-26 14:39:37