2013-04-05 15 views
8

Questo dovrebbe essere veloce - stiamo analizzando la seguente formato in R:Parsing ISO8601 formato in R

2013-04-05T07: 49: 54-07: 00

mio approccio attuale è

require(stringr) 
timenoT <- str_replace_all("2013-04-05T07:49:54-07:00", "T", " ") 
timep <- strptime(timenoT, "%Y-%m-%d %H:%M:%S%z", tz="UTC") 

ma fornisce NA.

+1

'% z' è l'offset firmato in ore, nel formato' hhmm', non 'hh: mm'. –

+0

Vedo: la migliore soluzione per sostituire ":"? – Rico

risposta

12

%z è l'offset firmato in ore, nel formato hhmm, non hh:mm. Ecco un modo per rimuovere l'ultimo :.

newstring <- gsub("(.*).(..)$","\\1\\2","2013-04-05T07:49:54-07:00") 
(timep <- strptime(newstring, "%Y-%m-%dT%H:%M:%S%z", tz="UTC")) 
# [1] "2013-04-05 14:49:54 UTC" 

Si noti inoltre che non è necessario rimuovere il "T".

+1

Sembra uno schema troppo generale. Penserei che qualcosa del genere sarebbe meno incline a correggere troppo: 'gsub (" ([+ -] \\ d \\ d) (:) "," \\ 1 ", argvec)' –

-1

strptime("2013-04-05 07:49:54-07:00", "%Y-%m-%d %H:%M:%S", tz="UTC")2013-04-05 07:49:54 UTC

Prova

timep <- strptime(timenoT, "%Y-%m-%d %H:%M:%S", tz="UTC") 
+0

Non è corretto, perché l'ora non è 7:49:54 UTC, sono 7 ore indietro rispetto all'ora UTC. Quindi se lo esprimi _in_ UTC, sarà 7 ore prima di 7: 49,54. –

2

Non fare la sostituzione di stringa.

NA significa solo che il tutto non ha funzionato, in modo da farlo pezzi per costruire la vostra espressione:

R> strptime("2013-04-05T07:49:54-07:00", "%Y-%m-%d") 
[1] "2013-04-05" 
R> strptime("2013-04-05T07:49:54-07:00", "%Y-%m-%dT%H:%M") 
[1] "2013-04-05 07:49:00" 
R> strptime("2013-04-05T07:49:54-07:00", "%Y-%m-%dT%H:%M:%S") 
[1] "2013-04-05 07:49:54" 
R> 

Inoltre, per ragioni che non ho mai pienamente capito - ma che probabilmente risiedono con funzione di libreria C ad esso sottesa , %z funziona solo sull'output, non sull'input. Quindi la tua NA probabilmente deriva dal tuo uso di %z.

+0

'% z' funziona sull'input, ma il formato è diverso. '% Z' funziona solo in uscita. –

+0

Ah, sì, grazie. La mia soluzione funziona ancora senza regexp o pacchetto Hadley. Quindi con la nostra definizione, vinco. –

+0

Fa tutto questo e, come bonus aggiuntivo, fornisce la risposta sbagliata. :) –