2016-04-14 83 views
0

背景信息(见底部的问题): 我在数以百计的网站每隔一小时不同的时区收到仪器收集的每小时平均观测数据集在过去的10年里。仪器从未针对夏令时进行调整,因此数据集中的所有时间都在本地标准时间。小时报告值是前一小时每分钟测量的平均值。年,月,日和小时分别列出。时间从1:24而不是0:23开始。我想创建一个包含UTC日期时间的新列。[R转换年 - 月 - 日小时当地标准时间为UTC

下面的数据表是我最近的解决方案的示例数据集,就其而言。对于两个星期的许多令人沮丧的时间,我已经用strptime,chron,POXITcl和POXITlt进行了实验,并且搜索了stackoverflow和其他来源以试图理解解决方案。我从来不确定我在尝试转换时发生了什么(除非我确定它是错误的,这是大部分时间!)。

我不知道,我已经创建了datetime列是我应该使用,要么,或如何从到UTC时间R将正确处理正确的中间步骤。我在数据和时间之间在我的日期时间列中插入了字符“T”,强制该列保持为字符,否则会发生意想不到的事情。例如,我的电脑操作系统时区是美国/多伦多和

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函数对你的情况很有用。