将字符和UTC偏移量转换为R中的POSIXct

时间:2016-02-09 21:23:25

标签: r timezone posixct timezone-offset strptime

我在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时,我遇到了问题。时间&#34; 2015-03-08 01:00:00&#34;由于某种原因转换为NA。

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

[1]&#34; 2015-03-08 00:00:00 MST&#34; &#34; 2015-03-08 01:00:00 MST&#34; NA
[4]&#34; 2015-03-08 03:00:00 MDT&#34;

我怀疑夏令时时间有问题,我必须在strptime函数中指定时区。如果我的所有数据的时区都是固定的,则以下代码对我有用:

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

[1]&#34; 2015-03-08 00:00:00 CET&#34; &#34; 2015-03-08 01:00:00 CET&#34; &#34; 2015-03-08 02:00:00 CET&#34; [4]&#34; 2015-03-08 03:00:00 CET&#34;

但是在我的数据中,时区是在我的表的utcOffset列中指定的,例如utcOffset = 1表示GMT + 1或utcOffset = 2表示GMT + 2。当我尝试使用格式&#34; GMT + n&#34;的时区代码时,我收到警告:

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?

1 个答案:

答案 0 :(得分: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