我有 1974-2013 年的时间序列数据,其中有一列为 datetimeUTC (YYYY-MM-DD hh:mm +0000),一列为 Olson 格式的时区(例如,加拿大/太平洋、加拿大/东部)。我可以将整个 UTCdatetime 列转换为公共时区,如下所示:
dataset$datetimeEST <- strptime(
dataset$datetimeUTC, format="%Y-%m-%d %H:%M:%S%z", tz="Canada/Eastern"
)
我如何转换datetimeUTC
to datetimeLOCAL
,给定每行相应的时区?
让我退后一点。我有来自全国各地(6 个时区)的数据,格式为 1974-2013 年的 ISO8601 表示形式。时间戳全年均采用当地标准时间(即,即使该地区的民用时间遵守 DST,也将忽略 DST)。我需要进行日期时间计算,这在 UTC 时间中可能是最安全的,所以这很容易。但是,我还需要提取特定民用时间段的数据,考虑 DST,并为该子集数据进行计算和绘图(例如,所有 6 个时区位置的高峰时间的所有数据)。
我在下面计算的 datetimeCLOCKTIME 似乎正在做我想要的绘图,但在进行日期时间计算时给出了错误的答案,因为它将日期时间存储在我的本地计算机的时区中,而没有实际转换时间。 @thelatemail 提供的解决方案正是我正在寻找的,但我无法让它在 Windows 中的 2012 年测试数据集上运行(见下文)。另外,我使用 strptime 转换为 POXITlt,他的解决方案在 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 默认为 UTC 偏移量 -ve,使时间戳中的 -ve 偏移量为正:
dataset$datetimeUTC <- strptime(dataset$timestampR, format="%Y-%m-%dT%H:%M:%S%z", tz="UTC")
当像这样转换为机器时间时,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]