R 列表中POSIXct日期的范围
考虑以下POSIXct日期列表:R 列表中POSIXct日期的范围,r,list,posixct,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", "
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")))
我正确地得到:
[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"
我是遗漏了什么还是哪里有bug?
times[[1]]
是一个向量,而times[c(1,3)]
是一个列表。在调用range
之前,将后者转换为向量,一切正常
不过,您不想使用取消列表
,因为它只会返回一个原子向量(范围
必须在内部执行类似操作),但您可以使用do.call
:
range(do.call(c,times[c(1,3)]))
将
用作.POSIXct所产生的差异很可能是由于时区问题。正如Joshua所说,时间是由时区决定的。试试看,例如:
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")
快速查看范围。默认值
确认它首先对其参数调用c(…,recursive=TRUE)
。如果要使用CEST日期,您还可以使用:Sys.setenv(TZ='CEST')
来更改环境的日期。当我这样做时,在尝试创建时间后,我收到了以下警告:警告消息:在strtime(xx,f)中,现在似乎可以工作了。有没有原因它在第一轮没有工作?它也是以“GMT”而不是“CEST”报告时间(即使在设置了TZ之后)…感谢您的解决方案,它更简单了!使用Sys.setenv可能更安全(TZ='Europe/Berlin')
或其他城市,因为许多缩写用于不同的时区。有关更多信息,请参阅Sys.timezone()
,享受时区的乐趣。
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")