4

考虑这个 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

2 回答 2

4

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

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

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

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

于 2012-07-26T14:17:00.027 回答
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")
于 2012-07-26T14:24:28.930 回答