R将年 - 月 - 日 - 小时当地标准时间转换为UTC

时间:2016-04-14 13:27:56

标签: r datetime utc dst iana

背景信息(请参阅底部的问题): 我收到了过去10年来每小时在不同时区的数百个站点通过仪器收集的每小时平均观测数据集。仪器永远不会针对夏令时进行调整,因此数据集中的所有时间都在当地标准时间内。每小时报告的值是前一小时每分钟测量的平均值。年,月,日和小时在单独的列中报告。时间从1:24而不是0:23。我想创建一个包含UTC日期时间的新列。

下面的数据表是我最新解决方案的样本数据集。对于两个星期的许多令人沮丧的小时,我已经尝试了strptime,chron,POXITcl和POXITlt,并搜索了stackoverflow和其他来源,试图了解解决方案的内容。我无法确定转换尝试中发生了什么(除非我确定这是错误的,大部分时间都是这样!)。

我不确定我创建的日期时间列是否应该使用正确的中间步骤,或者如何从R到正确处理的UTC时间。我在datetime列中的数据和时间之间插入了字符“T”以强制列保留为字符,否则会发生意外情况。例如,我的计算机操作系统时区是America / Toronto,并且

as.POSIXct(mydata$datetime, format="%Y-%m-%dT%H:%M %z")

2013-01-01T01:00-0800转换为2013-01-01 04:00:00 。上面的命令似乎是转换为我机器的时区,而不是UTC。因此,如果在运行命令

之前更改R环境时区而不更改计算机操作系统时区
Sys.setenv(TZ = "GMT")
mydata$dateUTC <- as.POSIXct(mydata $datetime, format="%Y-%m-%dT%H:%M %z") 
Sys.unsetenv("TZ")

然后上面的命令将 2013-01-01T01:00-0800转换为2013-01-01 09:00:00 ,这似乎是我正在寻找的UTC时间。

我不太担心hour24,因为无论使用什么方法,日期会自动增加到第二天,小时变为00:00(例如,2013-01-01 24:00变为2013-01-02 00:00)

从UTC转换为当地时间时,我并不太担心从标准时间变为夏令时的日期可以,并且多年来一直在变化。鉴于正确的UTC时间和Olson时区,如果我使用IANA时区数据库,这应该自动处理(我认为)。

问题1: 使用R,我应该如何将全年当地标准时间内报告的年 - 月 - 日 - 小时转换为UTC时间?

问题2: 使用R,我应该如何从UTC时间转换为本地标准时间(在民用时间不使用DST的地方转换为DST)?

问题3: 使用R,我应该如何将UTC时间转换为本地时间,同时考虑夏令时?

问题4: 为了从UTC转换为本地时间,我将需要IANA数据库中的时区名称。考虑到每个站点的纬度和经度,我是否可以通过某种方式从网络上的某个位置获取此信息?

filename = mydata
    site    year  month day hourend UTCoffset      datetime         obs
    2001    2015    1   1   22:00   -0200   2013-01-01T22:00-0200   1356
    2001    2015    1   1   23:00   -0200   2013-01-01T23:00-0300   1593
    2001    2015    1   1   24:00   -0200   2013-01-01T24:00-0200   946
    2001    2015    1   2   01:00   -0200   2013-01-02T01:00-0200   271
    2001    2015    1   2   02:00   -0200   2013-01-02T02:00-0200   665
    3001    2015    1   1   22:00   -0350   2013-01-01T22:00-0350   548
    3001    2015    1   1   23:00   -0350   2013-01-01T23:00-0350   936
    3001    2015    1   1   24:00   -0350   2013-01-01T24:00-0350   1938
    3001    2015    1   2   01:00   -0350   2013-01-02T01:00-0350   952
    3001    2015    1   2   02:00   -0350   2013-01-02T02:00-0350   1584
    4001    2015    1   1   22:00   -0400   2013-01-01T22:00-0400   1837
    4001    2015    1   1   23:00   -0400   2013-01-01T23:00-0400   1275
    4001    2015    1   1   24:00   -0400   2013-01-01T24:00-0400   382
    4001    2015    1   2   01:00   -0400   2013-01-02T01:00-0400   837
    4001    2015    1   2   02:00   -0400   2013-01-02T02:00-0400   592
    5001    2015    1   1   22:00   -0500   2013-01-01T22:00-0500   392
    5001    2015    1   1   23:00   -0500   2013-01-01T23:00-0500   15
    5001    2015    1   1   24:00   -0500   2013-01-01T24:00-0500   403
    5001    2015    1   2   01:00   -0500   2013-01-02T01:00-0500   993
    5001    2015    1   2   02:00   -0500   2013-01-02T02:00-0500   1287
    6001    2015    1   1   22:00   -0600   2013-01-01T22:00-0600   738
    6001    2015    1   1   23:00   -0600   2013-01-01T23:00-0600   992
    6001    2015    1   1   24:00   -0600   2013-01-01T24:00-0600   1392
    6001    2015    1   2   01:00   -0600   2013-01-02T01:00-0600   189
    6001    2015    1   2   02:00   -0600   2013-01-02T02:00-0600   1282
    7001    2015    1   1   22:00   -0700   2013-01-01T22:00-0700   839
    7001    2015    1   1   23:00   -0700   2013-01-01T23:00-0700   742
    7001    2015    1   1   24:00   -0700   2013-01-01T24:00-0700   942
    7001    2015    1   2   01:00   -0700   2013-01-02T01:00-0700   882
    7001    2015    1   2   02:00   -0700   2013-01-02T02:00-0700   993
    8001    2015    1   1   22:00   -0800   2013-01-01T22:00-0800   1140
    8001    2015    1   1   23:00   -0800   2013-01-01T23:00-0800   1532
    8001    2015    1   1   24:00   -0800   2013-01-01T24:00-0800   1834
    8001    2015    1   2   01:00   -0800   2013-01-02T01:00-0800   1732
    8001    2015    1   2   02:00   -0800   2013-01-02T02:00-0800   954

1 个答案:

答案 0 :(得分:2)

你可以查看R中的“Lubridate”包。这里的strptime函数对你的情况很有用。