2012-11-30 14 views
12

Ho un csv che comprende circa 2 milioni di righe di stringhe data nel formato:Speedup conversione di 2 milioni di righe di stringhe di data per POSIX.ct

2012/11/13 21:10:00 

Consente chiamata che csv$Date.and.Time

I voglio convertire queste date (e i loro dati di accompagnamento) a xts il più velocemente possibile

Ho scritto uno script che esegue la conversione bene (vedi sotto), ma è terribilmente lento e mi piacerebbe velocizzare questoil più possibile.

Ecco la mia attuale metodologia. Qualcuno ha qualche suggerimento su come farlo più veloce?

dt <- as.POSIXct(csv$Date.and.Time,tz="UTC") 

idx <- format(dt,tz=z,usetz=TRUE) 

Quindi lo script converte queste stringhe di data a POSIX.ct. Quindi esegue una conversione del fuso orario utilizzando format (z è una variabile che rappresenta la TZ a cui sto convertendo). Faccio quindi una normale chiamata xts per rendere questa una serie xts con il resto dei dati nel csv.

Questo funziona al 100%. È solo molto, molto lento. Ho provato a farlo funzionare in parallelo (non fa nulla, se non altro lo rende peggiore). Cosa intendo con "lento"?

user system elapsed 
155.246 16.430 171.650 

Questo è su un 3GhZ, ram 16 GB 2012 mb pro. Ne posso ricavare circa la metà su un processore simile con 32 GB di RAM su una macchina Win7

Sono sicuro che qualcuno ha un'idea migliore - Sono aperto ai suggerimenti tramite Rcpp ecc. Tuttavia, idealmente la soluzione funziona con csv piuttosto che qualche altro metodo, come la creazione di un database. Detto questo, ho intenzione di farlo tramite qualunque metodo fornirà la conversione più veloce.

Sarei molto grato di qualsiasi aiuto. Grazie in anticipo.

+1

Sapete qual è il passo che rallenta le cose: il passo 'as.POSIXct', il passo' format' o 'xts'? –

+0

Se cerchi fasttime (che non avresti saputo di fare senza la risposta di Dirk), troverai un paio di Qs simili [LINK1] (http://stackoverflow.com/questions/12898318/convert-character-to -date-quickly-in-r), [LINK2] (http://stackoverflow.com/questions/12786335/why-is-as-adate-slow-on-a-character-vector) – GSee

risposta

18

Si desidera il piccolo e semplice pacchetto fasttime di Simon che esegue questa operazione nel modo più rapido possibile --- non richiamando le funzioni di analisi del tempo ma utilizzando semplicemente le funzioni di stringa di livello C.

Non supporta tutti i formati come strptime. In realtà, non ha nemmeno una stringa di formato. Ma le varianti di formato ISO ben formate, ovvero yyyy-mm-dd hh:mm:ss.fff funzioneranno, e il tuo separatore / potrebbe anche funzionare.

+0

Mio dio - I Raramente mi stupisco di quanto possa essere efficace una soluzione, ma io ero così! Grazie mille. Dove ti mando un assegno? –

+2

system.time (dts <- fastPOSIXct (csv $ Date.and.Ora, "UTC")) utente 0,065 0,000 0,065 –

+0

Generalmente aiuta a sapere cosa si sta facendo e Simon ha davvero un talento per questo :) –

2

Provare a utilizzare lubridate - esegue tutte le analisi di data e ora utilizzando le espressioni regolari, quindi non solo è molto più veloce, ma è anche molto più flessibile.