在se中的seq函数生成时间中缺少小时?

时间:2014-05-12 14:20:58

标签: r time posixct seq

我在使用R:

生成适当的时间序列时遇到问题
fivemin <- seq(as.POSIXct("2014/01/01 0:00:00"), as.POSIXct("2014/04/01 0:00:00"), by="5 mins",tz="EST")
time <- data.frame(MasterTime=fivemin)

使用上面的代码,我可以得到一个包含25909个观测值的数据框。但是,在东部标准时间(没有夏令时)下,观测数量应为25920.与2014年9月3日的夏令时转换相差1小时,因为时间将从凌晨1点变为3 AM直接。我不确定R如何处理这种时间变化。我如何修改我的代码,以便R生成一个时间序列,而不会在2014年9月3日错过凌晨2点?有没有人对此有任何想法?

非常感谢!

1 个答案:

答案 0 :(得分:2)

如果您不想使用夏令时,请尝试设置tz ='UTC'

fivemin <- seq(as.POSIXct("2014/01/01 0:00:00", tz = 'UTC'), as.POSIXct("2014/04/01 0:00:00", tz = 'UTC'), by="5 mins")
head(fivemin)
length(fivemin)
#[1] 25921

除了'UTC'或'GMT'之外,最好不要在时区使用三字母标记,例如“EST”,因为这些是不明确的。澳大利亚有东部标准时间,美国也是如此。而是使用国家/城市

fivemin <- seq(as.POSIXct("2014-04-06 2:00:00", tz="Australia/Melbourne"), as.POSIXct("2014-04-06 3:00:00", tz="Australia/Melbourne"), by="5 mins")
length(fivemin)
# [1] 25   
# Melbourne's DST finished on 6 April 2014 at 3 am so there are 25 x 5 min periods in the hour between 2am and 3 am 


fivemin <- seq(as.POSIXct("2014-04-06 2:00:00", tz="Australia/Brisbane"), as.POSIXct("2014-04-06 3:00:00", tz="Australia/Brisbane"), by="5 mins")
length(fivemin)
# [1] 13  Brisbane doesn't use DST so no problem

同时检查lubridate包中的dst功能。

如果您想保留时区,但是请使用标准时间,请尝试使用。

library(lubridate)
fivemin <- seq(as.POSIXct("2014-04-06 2:00:00", tz="Australia/Melbourne"), as.POSIXct("2014-04-06 3:00:00", tz="Australia/Melbourne"), by="5 mins")
fivemin[dst(fivemin)] <- fivemin[dst(fivemin)]-3600