генерация временных рядов без перехода на летнее время — r

#r #datetime #dst #posixct #posixlt

Вопрос:

Я пытаюсь сгенерировать временной ряд с 2000-01-01 00:00:00 до 2020-12-31 23:00:00 (часовой временной интервал) без учета перехода на летнее время. В других сообщениях предлагается использовать GMT или UTC при его создании в формате POSIX. Так вот что я попробовал:

 ##   create date seq
Dates <- seq(as.POSIXct("2000-01-01 00:00:00"), as.POSIXct("2020-12-31 23:00:00"), by = "hour", tz='UTC')
Dates <- as.data.frame(Dates)
colnames(Dates)[1] <- "DatesR"

## check dup 2
testing <- as.character(Dates$DatesR)
dup <- as.data.frame(which(duplicated(testing))) ## not good

 

Как вы можете видеть, дубликаты все еще присутствуют. Пропущенные значения также существуют.

Я также попытался использовать zone вместо tz, вот так:

 
##   create date seq
Dates <- seq(as.POSIXct("2000-01-01 00:00:00"), as.POSIXct("2020-12-31 23:00:00"), by = "hour", zone='UTC')
Dates <- as.data.frame(Dates)
colnames(Dates)[1] <- "DatesR"

## check dup 2
testing <- as.character(Dates$DatesR)
dup <- as.data.frame(which(duplicated(testing))) ## not good
 

Все равно не работает. Есть какие-нибудь рекомендации??

Ответ №1:

tz= это аргумент о as.POSIXct том , а не о seq том .

 from <- as.POSIXct("2000-01-01 00:00:00", tz = "UTC")
to <- as.POSIXct("2020-12-31 23:00:00", tz = "UTC")
s <- seq(from, to, by = "hour")

anyDuplicated(format(s))
## [1] 0
 

Также можно установить для всего сеанса значение по умолчанию UTC.

 Sys.setenv(TZ = "UTC")

Sys.timezone()  # check that it has been set
## [1] "UTC"

from2 <- as.POSIXct("2000-01-01 00:00:00")
to2 <- as.POSIXct("2020-12-31 23:00:00")
s2 <- seq(from2, to2, by = "hour")

anyDuplicated(format(s2))
## [1] 0
 

Также обратите внимание, что seq на самом деле не создается никаких дубликатов с использованием часового пояса по умолчанию. Именно преобразование в символ вводит дубликаты.

 Sys.setenv(TZ = "")  #  change back to default TZ

from3 <- as.POSIXct("2000-01-01 00:00:00")
to3 <- as.POSIXct("2020-12-31 23:00:00")
s3 <- seq(from3, to3, by = "hour")

anyDuplicated(s3)
## [1] 0

anyDuplicated(format(s3))
## [1] 7250