2016-04-14 93 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函數對你的情況很有用。