Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将R中的字符转换为POSIXct将丢失时区_R_Posixct - Fatal编程技术网

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

将R中的字符转换为POSIXct将丢失时区,r,posixct,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进行转换时,会发生以下

我试图将字符串转换为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"

SD$BGN_DTTM这仍然存在您注意到的日光/标准时间问题:

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

strtime
函数拒绝接受输入的“%Z”格式(它的防御是有文档记录的)。许多人为了让R时区工作到他们(dis?)满意的程度,在显示器上掉了大量的头发和键盘。

众所周知,时间是相对的。将时间存储为
UTC
/
GMT
或相对于
UTC
/
GMT
将确保夏令时等仅在您希望时生效,具体如下:

因此,如果:

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
,无需任何夏时制转换为
CDT
。 这样,当或如果您转换为本地中央时区时,将返回正确的
CST
时间,而不会更改夏令时的实际数据。(即,-当R打印
CDT
时,它仅将时间的显示向前移动一小时,但基本数字数据未更改。最后一种情况在标准时间返回时按预期显示):


这看起来似乎是一个答案,但当我深入研究时,它似乎不那么令人满意。实际上,您将问题更改为将所有输入时间都放在CST中,而不是处理时区转换。在夏季,芝加哥与格林尼治标准时间相差7小时。@BondedDust-我没有改变任何事情。这是OP.R中的原始字符数据,处理从格林尼治标准时间到芝加哥时间的时区变化——底层数据保持不变。与你回答的结果相反,2:30 CST改为2:30 CDT,这实际上不是同一时间点。我想知道更好的头脑已经在这个问题上挣扎,这是一个小小的安慰@最近的邮件-你的解释和例子非常有用。原始数据集实际上包含许多时区-这些是本地时钟上记录的事件的日期/时间。我认为最好创建一个新列,加载日期/时间,然后返回并应用所示的适当时区-因此基本上我都使用UTC。谢谢你们两个@42:为什么比格林尼治标准时间晚7小时?维基百科指出CST=UTC-06:00(冬季),而CDT=UTC-05:00(夏季),两者都代表CT区(芝加哥所在地):一个小评论。CST作为ISO时区,代表中国标准时间。在美国,人们只会将CST视为中心标准时间——但这个缩写并不是标准时间。所以,在这种情况下,如果R识别出时区,它仍然会给出令人惊讶的结果。
out <- as.POSIXct(x,tz="ETC/GMT+6")
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"
out - strptime(x, format="%Y-%m-%d %H:%M:%S", tz="America/Chicago")
#Time differences in secs
#[1] 3600 3600 3600 3600 3600    0