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

时间:2015-03-20 01:08:52

标签: r posixct

我正在尝试将字符串转换为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读取所示的时区信息?

2 个答案:

答案 0 :(得分:6)

在日光/标准时间内,您仍会遇到问题:

> 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函数拒绝遵守&#34;%Z&#34;输入的格式(在其辩护中记录。)许多人已经失去了大量的头发和可能的一些键盘进入监视器,努力让R时区工作满足他们的(dis?)满意度。

答案 1 :(得分:3)

众所周知,时间是相对的。将时间保存为UTC / GMT或相对于UTC / GMT将确保夏令时等仅在您需要时才会发挥作用,如:{{ 3}}

所以,如果:

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,这是夏令时,落后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与其他答案进行比较,您可以看到所有夏令时案例的实际数字时差为1小时:

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