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的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UTC 时间转换为本地时间

Python-时间模块-time

使用 JS 的 new Date() 的 UTC 时间

UTC是啥时区

JAVA UTC时间的基准点问题

如何将 UTC 日期字符串转换为本地时间 (systemTimeZone)