2011-10-25 12 views
6

Ho un file che formatta i timestamp come 25/03/2011 9:15:00 p.m.Parse timestamp con a.m./p.m

Come posso analizzare questo testo per una classe di data-ora sia con strptime o as.POSIXct?

Ecco cosa quasi funziona:

> as.POSIXct("25/03/2011 9:15:00", format="%d/%m/%Y %I:%M:%S", tz="UTC") 
[1] "2011-03-25 09:15:00 UTC" 

Ecco ciò che non funziona, ma mi piacerebbe avere di lavoro:

> as.POSIXct("25/03/2011 9:15:00 p.m.", format="%d/%m/%Y %I:%M:%S %p", tz="UTC") 
[1] NA 

sto usando R versione 2.13.2 (2011-09-30) su MS Windows. Il mio locale di lavoro è "C":

Sys.setlocale("LC_TIME", "C") 
+0

'? Strptime' dice che'% p' è "indicatore AM/PM nelle impostazioni internazionali". http://stdcxx.apache.org/doc/stdlibref/time-put.html dice nel locale C che è AM/PM, quindi penso che dovrete 'sub (" am "," AM ",. ..) 'e' sub ("pm", "PM", ...) 'prima. (Probabilmente c'è una slick espressione regolare che farebbe tutto in una volta.) –

+0

@BenBolker: ho avuto la tua espressione regolare liscia qui ... :) –

risposta

10

Sembra che l'indicatore AM/PM non possa includere la punteggiatura. Provalo dopo aver rimosso la punteggiatura:

td <- "25/03/2011 9:15:00 p.m." 
tdClean <- gsub("(.)\\.?[Mm]\\.?","\\1m",td) 
as.POSIXct(tdClean, format="%d/%m/%Y %I:%M:%S %p", tz="UTC") 
# [1] "2011-03-25 21:15:00 UTC" 
0

Proprio imbattuto in questo, come un'altra opzione è possibile utilizzare stringr pacchetto.

library(stringr) 
data$date2 <- str_sub(data$date, end = -4) 
# this removes the punctuation but holds onto the A/P values 
data$date2 <- str_c(data$date2, 'm') 
# adds the required m