2016-02-09 30 views
1

偏移POSIXct轉換字符和UTC我有R中的以下數據:中的R

times <- c("2015-03-08 00:00:00", "2015-03-08 01:00:00", "2015-03-08 02:00:00", "2015-03-08 03:00:00") 
utcOffsets <- c(2, 1, 1, 1) 
mydata <- data.frame(time=times, utcOffset=utcOffsets) 

在我的表中的UTCOFFSET列表示時區的每個數據值的偏移量。當我嘗試使用strptime函數將我的數據轉換爲POSIXct時,出現問題。由於某種原因,時間「2015-03-08 01:00:00」被轉換爲NA。

as.POSIXct(strptime(mydata$time, "%Y-%m-%d %H:%M:%S")) 

[1] 「2015年3月8日00:00:00 MST」, 「2015年3月8日01:00:00 MST」 NA
[4]「2015年3月8日03: 00:00 MDT「

我懷疑夏令時的時間有問題,我必須在strptime函數中指定時區。如果時區是固定的爲我所有的數據,下面的代碼會爲我工作:

as.POSIXct(strptime(mydata$time, "%Y-%m-%d %H:%M:%S", tz="Europe/Prague")) 

[1]「2015年3月8日00:00 CET」,「2015年3月8日01: 00:00 CET「」2015-03-08 02:00:00 CET「 [4]」2015-03-08 03:00:00 CET「

但是,在我的數據中,時區是在我的表的utcOffset列,例如utcOffset = 1表示GMT + 1或utcOffset = 2表示GMT + 2。當我試圖格式「GMT + N」使用時區代碼,我得到一個警告:

as.POSIXct(strptime(mydata$time, "%Y-%m-%d %H:%M:%S", tz="GMT+1")) 

[1] "2015-03-08 00:00:00 GMT" "2015-03-08 01:00:00 GMT" "2015-03-08 02:00:00 GMT" 
[4] "2015-03-08 03:00:00 GMT" 
Warning messages: 
1: In strptime(mydata$time, "%Y-%m-%d %H:%M:%S", tz = "GMT+1") : 
    unknown timezone 'GMT+1' 
2: In as.POSIXct.POSIXlt(strptime(mydata$time, "%Y-%m-%d %H:%M:%S", : 
    unknown timezone 'GMT+1' 
3: In as.POSIXlt.POSIXct(x, tz) : unknown timezone 'GMT+1' 

我如何用我的表中的信息UTCOFFSET我的數據轉換爲POSIXct?

+2

我會用' 「等/ GMT + 1」' –

+0

感謝去,'as.POSIXct(strptime(MYDATA $時間,「%Y-%m-%d%H:%M:%S」,tz =「Etc/GMT + 1」))'在Linux和Windows上均可使用。但是,當我嘗試使用utcOffset列的值時:as.POSIXct(strptime(mydata $ time,「%Y-%m-%d%H:%M:%S」),tz = paste(「Etc/GMT +「,mydata $ utcOffset,sep =」「)))'我仍然收到'無效'tz'值'錯誤。 – jirikadlec2

+1

將utcOffset添加到您的所有時間並將它們引用到UTC是什麼時候? POSIXct單位是秒,所以你會添加:'times.utc < - times + utcOffsets * 3600' – oshun

回答

2

由於oshun的評論,我發現一個答案,我的問題:

times <- c("2015-03-08 00:00:00", "2015-03-08 01:00:00", "2015-03-08 02:00:00", "2015-03-08 03:00:00") 
utcOffsets <- c(2, 1, 1, 1) 
mydata <- data.frame(time=times, utcOffset=utcOffsets) 

# convert the times to POSIXct (use UTC as default timezone) 
localTimes <- as.POSIXct(times, format="%Y-%m-%d %H:%M:%S", tz="GMT") 
mydata$UTCTime <- localTimes + utcOffsets*3600