在 R 中将字符转换为 POSIXct 会丢失时区

Converting character to POSIXct in R loses time zone

我正在尝试将字符串转换为 POSIXct 日期格式,并且 运行 转换为时区信息有问题。

原来的角色数据是这样的:

SD$BGN_DTTM
[1] "1956-05-25 14:30:00 CST" "1956-06-05 16:30:00 CST" "1956-07-04 15:30:00 CST"
[4] "1956-07-08 08:00:00 CST" "1956-08-19 12:00:00 CST" "1956-12-23 00:50:00 CST"

但是当我尝试使用 as.POSIXct 进行转换时,会发生这种情况:

SD$BGN_DTTM <- as.POSIXct(SD$BGN_DTTM)
[1] "1956-05-25 14:30:00 PDT" "1956-06-05 16:30:00 PDT" "1956-07-04 15:30:00 PDT"
[4] "1956-07-08 08:00:00 PDT" "1956-08-19 12:00:00 PDT" "1956-12-23 00:50:00 PST"

函数似乎没有读取我指定的时区。由于我的计算机处于 PDT 状态,因此看起来它已经使用了它。另请注意,它已将 PST 附加到最后一个日期(看起来很奇怪)。谁能告诉我这里发生了什么,是否有一种方法可以让 R 读取所示的时区信息?

这仍然会出现您注意到 daylight/standard 次的问题:

> strptime(test, format="%Y-%m-%d %H:%M:%S", tz="America/Chicago")
[1] "1956-05-25 14:30:00 CDT" "1956-06-05 16:30:00 CDT"
[3] "1956-07-04 15:30:00 CDT" "1956-07-08 08:00:00 CDT"
[5] "1956-08-19 12:00:00 CDT" "1956-12-23 00:50:00 CST"

strptime 函数拒绝接受输入的“%Z”格式(在其辩护中有记录。)许多人已经失去了大块头发,可能还有一些键盘进入显示器以努力获得R 时区正在满足他们的(不?)满意度。

众所周知,时间是相对的。将时间存储为 UTC/GMT 或相对于 UTC/GMT 将确保夏令时等仅在您需要时发挥作用,如:Does UTC observe daylight saving time?

所以,如果:

x <- c("1956-05-25 14:30:00 CST","1956-06-05 16:30:00 CST", "1956-07-04 15:30:00 CST",
"1956-07-08 08:00:00 CST", "1956-08-19 12:00:00 CST","1956-12-23 00:50:00 CST")

您可以发现 CSTUTC/GMT 晚 6 小时(与 CDT 相对,后者是夏令时,比 GMT 晚 7 小时)
因此:

out <- as.POSIXct(x,tz="ETC/GMT+6")

将代表 CST 没有任何夏令时转变为 CDT。 这样,当您转换为本地中央时区时,将返回正确的 CST 时间,而不会更改夏令时的实际数据。 (即 - 当 R 打印 CDT 时,它只是将时间的 显示 向前移动一个小时,但基础数值数据 未更改 。当标准时间重新开始时,最后一个案例按预期显示):

attr(out,"tzone") <- "America/Chicago"
out
#[1] "1956-05-25 15:30:00 CDT" "1956-06-05 17:30:00 CDT" "1956-07-04 16:30:00 CDT"
#[4] "1956-07-08 09:00:00 CDT" "1956-08-19 13:00:00 CDT" "1956-12-23 00:50:00 CST"

即- 对于情况 1,15:30 CDT == 14:30 CST - 如最初指定的那样,当夏令时停止时,对于情况 6,00:50 CST == 00:50 CST 如最初指定的那样。

将这个最终 out 与另一个答案进行比较,您可以看到所有夏令时情况下的实际数值时差为一小时:

out - strptime(x, format="%Y-%m-%d %H:%M:%S", tz="America/Chicago")
#Time differences in secs
#[1] 3600 3600 3600 3600 3600    0