R:将JSON时间格式转换为POSIX

时间:2012-01-30 05:26:57

标签: json r apply unix-timestamp

我有一个JSON字符串,我放入数据框。我能够做到这一点,但我无法使用其中一个应用函数将所有时间字符串转换为POSIX格式。

有关更多背景信息,请参阅here

JSON时间格式为:

%h-%m-%dT%H:%M:%S-

2012-01-29T17:00:45-11:00

假设我有一个如图所示的数据框:

    .Close    .High     .Low    .Open                      Time
1 5.517339 5.539509 5.404098 5.495318 2012-01-30T12:00:45+08:00
2 5.485943 5.521242 5.467357 5.467641 2012-01-30T11:00:45+08:00
str(x)
'data.frame':   2 obs. of  5 variables:
 $ .Close: num  5.52 5.49
 $ .High : num  5.54 5.52
 $ .Low  : num  5.4 5.47
 $ .Open : num  5.5 5.47
 $ Time  : Factor w/ 2 levels "2012-01-30T12:00:45+08:00",..: 1 2

为了得到这些数据我做了:

y = getURI(url5)
y
"[{\"close\":5.51465512590582,\"highest\":5.58424835532979,\"lowest\":5.51349813464496,\"open\":5.53871134631156,\"start_time\":\"2012-01-30T13:00:45+08:00\"},{\"close\":5.55283232755149,\"highest\":5.58422873584898,\"lowest\":5.40409845894964,\"open\":5.49531753804068,\"start_time\":\"2012-01-30T12:00:45+08:00\"}]"
x = fromJSON(y)
x = do.call(rbind,lapply(x,as.data.frame))

我想将JSON时间格式更改为POSIX,所以首先我将删除该T分隔符,然后合并它们,然后应用于每个。

jsontime = function ( data ) {
    x = data
    x$Time=as.character(x$Time)
    x$Time = strsplit(x$Time,split="T")
    a = x$Time[[1]][1]
    b = x$Time[[1]][2]
    x$Time = paste(a,b,sep=" ")
    x$Time=as.POSIXlt(x$Time,origin="1970-01-01",tz="GMT")
    return (x)
    }

2012-01-29T22:00:45-07:00现已成为2012-01-29 21:00:45

问题在于a = x $ time [[1]] [1]和b = x $ Time [[1]] [2]。这些太具体了,如果我想将它们应用于数据框,我将只返回所有这些的第一次设置。

有关我如何正确编码的任何线索。

1 个答案:

答案 0 :(得分:3)

您可以将as.POSIXltformat参数一起使用(有关详情,请参阅as.Date。嗯,我必须man strftime查看日期规范(* nix系统) ):

x$Time <- as.POSIXlt(x$Time, format="%Y-%m-%dT%H:%M:%S", 
                     origin="1970-01-01",tz="GMT")

这完全忽略了+08:00-07:00(你现在的代码也是如此) - 这是你想要的吗?

您可以使用%z作为偏移量,但不要使用冒号,即+0800-0700。所以我们首先要剥掉那个冒号:

# replace [+-]hh:mm with [+-]hhmm for timezone offset
# i.e. 2012-01-30T12:00:45+08:00 -> 2012-01-30T12:00:45+0800
x$Time <- gsub('([-+][0-9]{2}):([0-9]{2})$','\\1\\2',x$Time)
# do as.POSIXlt with %z
x$Time <- as.POSIXlt(x$Time, format="%Y-%m-%dT%H:%M:%S%z", 
                     origin="1970-01-01",tz="GMT")

这会正确地将偏移量添加到时间。