#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