Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 列表中POSIXct日期的范围_R_List_Posixct - Fatal编程技术网

R 列表中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", "

考虑以下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")))
我正确地得到:

[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")