背景信息(请参阅底部的问题): 我收到了过去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
答案 0 :(得分:2)
你可以查看R中的“Lubridate”包。这里的strptime函数对你的情况很有用。