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

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


person Vicki1227    schedule 12.05.2014    source источник
comment
Явно установите часовой пояс в as.POSIXct.   -  person Roland    schedule 12.05.2014
comment
Вы также можете игнорировать переход на летнее время на время сеанса с помощью Sys.setenv(TZ='EST').   -  person Matthew Plourde    schedule 12.05.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
person Tony Ladson    schedule 12.03.2015