Пропущенный час в seq функция генерации времени в R?

У меня проблема с генерацией правильной временной последовательности с использованием 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. Разница составляет 1 час с перехода на летнее время 03.09.2004, потому что тогда время изменится с 1:00 до 3 AM прямо. Я не уверен, как R справляется с такого рода изменениями времени. Как я могу пересмотреть мой код, чтобы R создавал временную последовательность, не пропуская 2 часа ночи 03.09.2014? У кого-нибудь есть идеи по этому поводу?

Большое спасибо!

1 ответ

Если вы не хотите использовать летнее время, попробуйте установить 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

Также проверьте функцию dst в пакете lubridate.

Если вы хотите сохранить часовой пояс, но использовать стандартное время, попробуйте что-то вроде.

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
Другие вопросы по тегам