R将年-月-日-小时本地标准时间转换为UTC
Posted
技术标签:
【中文标题】R将年-月-日-小时本地标准时间转换为UTC【英文标题】:R convert year-month-day-hour local standard time to UTC 【发布时间】:2016-08-06 02:18:54 【问题描述】:背景信息(见底部的问题): 在过去 10 年中,我每小时收到一个由仪器在不同时区的数百个站点收集的每小时平均观测数据集。仪器永远不会针对夏令时进行调整,因此数据集中的所有时间都是当地标准时间。每小时报告的值是前一小时每分钟进行的测量的平均值。年、月、日和小时在单独的列中报告。时间从 1:24 开始,而不是 0:23。我想创建一个包含 UTC 日期时间的新列。
下面的数据表是我最近的解决方案的示例数据集,就目前而言。在两周的许多令人沮丧的时间里,我尝试了 strptime、chron、POXITcl 和 POXITlt,并搜索了 *** 和其他资源以尝试了解解决方案是什么。我从不确定我的转换尝试中发生了什么(除非我确定它是错误的,这是大多数时候!)。
我不确定我创建的日期时间列是否是我应该使用的正确中间步骤,或者如何从该中间步骤获取 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 时间和奥尔森时区,如果我使用 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】:您可以查看 R 中的“Lubridate”包。那里的 strptime 函数对您的情况很有用。
【讨论】:
以上是关于R将年-月-日-小时本地标准时间转换为UTC的主要内容,如果未能解决你的问题,请参考以下文章