生成没有夏令时的时间序列 - r

Posted

技术标签:

【中文标题】生成没有夏令时的时间序列 - r【英文标题】:generation of time series without daylight savings - r 【发布时间】:2021-10-20 11:53:33 【问题描述】:

我正在尝试生成从 2000-01-01 00:00:00 到 2020-12-31 23:00:00(每小时时间步长)的时间序列,而不考虑夏令时。其他帖子建议在将其生成为 POSIX 时使用 GMT 或 UTC。所以这就是我尝试过的:

##   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

【讨论】:

以上是关于生成没有夏令时的时间序列 - r的主要内容,如果未能解决你的问题,请参考以下文章

从 R 中的 GMT 转换时考虑夏令时

R - 从一年中获取夏令时开始和结束

在 R 中处理东部标准时间 (EST) 和东部夏令时 (EDT)

在指定时区导入日期时间,忽略夏令时

R方法通过将整个数据集向上移动一个小时/向下移动一个小时半年来将标准转换为夏令时?

为啥 R 在多年之间不能始终如一地处理夏令时?