在 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")
您可以发现 CST
比 UTC
/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
我正在尝试将字符串转换为 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")
您可以发现 CST
比 UTC
/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