列表中的POSIXct日期范围

时间:2012-07-26 14:09:35

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

我错过了什么或某处有错误吗?

2 个答案:

答案 0 :(得分:4)

times[[1]]是一个向量,而times[c(1,3)]是一个列表。在调用range之前将后者转换为向量,一切都很好。

你不想使用unlist,因为它只返回一个原子向量(range必须在内部执行类似的操作),但你可以使用do.call

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

使用as.POSIXct所带来的差异可能是由于时区问题造成的。

答案 1 :(得分: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")