【发布时间】:2014-08-26 20:21:56
【问题描述】:
我有 1974 年至 2013 年的时间序列数据,其中有一列表示 datetimeUTC (YYYY-MM-DD hh:mm +0000),有一列表示奥尔森格式的时区(例如,加拿大/太平洋、加拿大/东部) .我可以将整个 UTCdatetime 列转换为这样的公共时区:
dataset$datetimeEST <- strptime(
dataset$datetimeUTC, format="%Y-%m-%d %H:%M:%S%z", tz="Canada/Eastern"
)
在给定每行对应的时区的情况下,如何将datetimeUTC 转换为datetimeLOCAL?
让我稍微备份一下。我有来自全国各地(6 个时区)的数据,格式为 1974-2013 年的 ISO8601 表示。时间戳全年采用当地标准时间(即,即使该地区的民用时间遵守 DST,也忽略 DST)。我需要进行日期时间计算,这在 UTC 时间可能是最安全的,所以这很容易。但是,我还需要提取特定民用时间段的数据,同时考虑 DST,并为该子集数据进行计算和绘图(例如,所有 6 个时区位置的高峰时间的所有数据)。
我在下面计算的 datetimeCLOCKTIME 似乎正在做我想要的绘图,但在进行日期时间计算时给出了错误的答案,因为它将日期时间存储在我本地机器的时区中而没有实际转换时间。 @thelatemail 提供的解决方案是我正在寻找的,但我无法让它在 2012 年的测试数据集上的 Windows 中工作(见下文)。另外,我使用的是转换为 POXITlt 的 strptime,他的解决方案是在 POXITct 中。我是 R 新手,所以任何帮助都将不胜感激。
测试数据集:
dataset <- data.frame (timestampISO8601 = c("2012-04-25T22:00:00-08:00","2012-04-25T22:15:00-08:00","2012-04-25T22:30:00-08:00","2012-04-25T22:45:00-08:00","2012-04-25T23:00:00-08:00","2012-04-25T23:15:00-08:00","2012-04-25T23:30:00-08:00","2012-04-25T23:45:00-08:00","2012-04-26T00:00:00-08:00","2012-04-26T00:15:00-08:00","2012-04-26T00:30:00-08:00","2012-04-26T00:45:00-08:00","2012-04-26T01:00:00-08:00","2012-04-26T01:15:00-08:00","2012-04-26T01:30:00-08:00","2012-04-26T01:45:00-08:00","2012-04-26T02:00:00-08:00","2012-04-25T22:00:00-03:30","2012-04-25T22:15:00-03:30","2012-04-25T22:30:00-03:30","2012-04-25T22:45:00-03:30","2012-04-25T23:00:00-03:30","2012-04-25T23:15:00-03:30","2012-04-25T23:30:00-03:30","2012-04-25T23:45:00-03:30","2012-04-26T00:00:00-03:30","2012-04-26T00:15:00-03:30","2012-04-26T00:30:00-03:30","2012-04-26T00:45:00-03:30","2012-04-26T01:00:00-03:30","2012-04-26T01:15:00-03:30","2012-04-26T01:30:00-03:30","2012-04-26T01:45:00-03:30","2012-04-26T02:00:00-03:30"), olson = c("Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Pacific","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland","Canada/Newfoundland"), value = c(0,0,1,2,5,11,17,19,20,19,17,11,5,2,1,0,0,-3,-3,-2,-1,2,8,14,16,17,16,14,8,2,-1,-2,-3,-3), stringsAsFactors=FALSE)
从 UTC 偏移量中删除“:”。 (R 期望 UTC 偏移的格式为 nnnn):
dataset$timestampR<- paste(substr(dataset$timestampISO8601,1,22),substr(dataset$timestampISO8601,24,25),sep="")
当转换为 UTC 时间时,R 默认为 -ve 作为 UTC 偏移量,使时间戳中的 -ve 偏移量为正:
dataset$datetimeUTC <- strptime(dataset$timestampR, format="%Y-%m-%dT%H:%M:%S%z", tz="UTC")
当像这样转换为 MACHINE 时间时,R 读取输入时间并将其转换为本地机器时区的时间 - 在我的例子中,这是加拿大/东部:
dataset$datetimeMACHINE <- strptime(dataset$timestampR, format="%Y-%m-%dT%H:%M:%S%z")
当像这样转换为 CLOCKTIME 时间时,R 读取输入时间并分配本地机器的时区(当前在我的机器上是 EDT)而不进行任何时间转换:
dataset$datetimeCLOCKTIME <- strptime(dataset$timestampR,format="%Y-%m-%dT%H:%M:%S")
查看数据集的结构:
str(dataset)
绘图行为不同
library(ggplot2)
qplot(data=dataset,x=datetimeUTC,y=value)
qplot(data=dataset,x=datetimeMACHINE,y=value)
qplot(data=dataset,x=datetimeCLOCKTIME,y=value)
计算结果不同。 datetimeCLOCKTIME 的计算结果不正确:
range (dataset$datetimeUTC)
range (dataset$datetimeMACHINE)
range (dataset$datetimeCLOCKTIME)
dataset$datetimeUTC[34] - dataset$datetimeUTC[1]
dataset$datetimeMACHINE[34] - dataset$datetimeMACHINE[1]
dataset$datetimeCLOCKTIME[34] - dataset$datetimeCLOCKTIME[1]
【问题讨论】:
-
你不能。时区适用于整个日期/时间向量,而不是特定元素。如果您备份几个步骤并解释您要解决的更大问题,可能会有更简单的方法来解决它。
-
仅供参考 - 您应该考虑使用规范时区,例如
"America/Toronto"或"America/Vancouver"。"Canada/*"区域主要用于向后兼容的目的。 See the list here 如果您在确定要使用的正确区域时需要帮助。 -
等一下,你说
"DST is disregarded even if civilian time in the region observes DST."如果是这样,那么你根本不应该使用奥尔森时区。像"Canada/Eastern"这样的区域仅在标准时间是 UTC-05:00。 DST 期间是 UTC-04:00。如果这不是您想要的,您可能应该使用固定偏移量。 -
@Matt Johnson。这些数据是从记录当地标准时间的仪器中收集的,具有固定的偏移量,全年无休,未针对 DST 进行调整。这些地方中的一些(但不是全部)遵守夏令时。因此,根据我想要做什么,我需要能够将所有内容从本地标准时间转换为本地时间,并在适用的情况下考虑 DST。感谢您提供有关规范时区的提示!