2012-01-30 19 views
2

私はデータフレームに入れたJSON文字列を持っています。私はそれを行うことができますが、すべての時間文字列をPOSIX形式に変換するために適用関数の1つを使用することに問題があります。R: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年1月29日21時00分45秒

問題となっているが、A = X $時間[[1であります]] [1]とb = x $ Time [[1]] [2]を使用します。これらはあまりにも具体的なものであり、データフレームにこれらを適用したい場合は、それらのすべてに初めて設定されたものを返すだけです。

これを正しくコード化する方法についての手がかりがあります。

あなたは(私は日付仕様(* nixのシステム)を参照して man strftimeをしなければならなかった、まあ詳細については as.Dateを参照してください。) formatパラメータで as.POSIXltを使用することができます

答えて

3

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

これは完全に無視し+08:00し、 -07:00(あなたの現在のコードもそうです) - それはあなたが意図したものですか?

オフセットには%zを使用できますが、コロンは不要です(つまり、と-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") 

これは、オフセットを時間に正しく追加します。

+0

私は1秒の小数部分は必要ありませんが、他の部分は興味があるかもしれません。 – Kevin

+0

'+08:00'は秒単位ではありません。タイムゾーンの時間オフセットです - 「タイムゾーンはUTC + 08:00のxxxです」? –

+0

ああ、私は+を見逃しています。あなたは今日2つのことを教えてくれました。 – Kevin

関連する問題