2012-02-21 15 views
15

Sto lavorando in R e sto leggendo csv che ha data e ora nella prima colonna. Voglio importare prima questo file csv in R e poi convertirlo in zoo obect.Lettura csv con data e ora

Sto usando il codice nella R

EURUSD <- as.xts(read.zoo("myfile.csv",sep=",",tz="",header=T)) 

Il mio file CSV contengono dati nel formato:

Date,Open,Low,High,Close 
2006-01-02 10:01:00,2822.9,2825.45,2822.1,2824.9 
2006-01-02 10:02:00,2825,2825.9,2824,2824.95 
2006-01-02 10:03:00,2824.55,2826.45,2824,2826.45 
2006-01-02 10:04:00,2826.45,2826.45,2824.9,2825.5 
2006-01-02 10:05:00,2825.15,2825.5,2824,2824.85 
2006-01-02 10:06:00,2824.7,2825.5,2823.7,2823.8 
2006-01-02 10:07:00,2823.95,2824.45,2823.55,2824 
2006-01-02 10:08:00,2824,2824.85,2823.5,2824.85 
2006-01-02 10:09:00,2824.25,2825.45,2824,2825.45 
2006-01-02 10:10:00,2825.2,2827,2825,2827 

Quando eseguo il comando precedente per importare i dati in al RI ottenere il folowwwing errore:

Error in as.POSIXlt.character(x, tz, ...) : 
    character string is not in a standard unambiguous format 

Ho provato a trovare tutti i modi per risolvere il problema. Leggo tanti blog su Internet ma nessuno dei metodi funziona per me.

Spero che qualcuno mi aiuti.

+1

Sembra che ci sia qualcosa nella colonna della data che lo infastidisce. Probabilmente uno spazio vuoto, "-", ",", "n.a." o qualcosa di simile. –

+0

Sei sicuro che il tuo 'sep' è una virgola?il tuo file di esempio csv sembra invece la sua scheda? –

+0

È una virgola separata. Apro il mio file CSV nel blocco note e mostra chiaramente la virgola separata – user395882

risposta

5

Sembra che l'errore sia dovuto al fatto che R non riconosce in quale formato è inserita la colonna della data (non può funzionare - data/mese/anno? Mese/data/anno? Ecc.).

È possibile specificare R in quale formato è utilizzato l'argomento format su read.zoo (vedere ?strptime per gli identificatori che è possibile utilizzare).

Ad esempio, se è stata data/mese/ora l'anno (24 ore): minuti, si potrebbe fare:

EURUSD <- as.xts(read.zoo(file_name, 
          sep=',', 
          tz='', 
          header=T, 
          format='%d/%m/%Y %H:%M:%S')) # see the 'format' argument? 

(nota - nella sua domanda il frammento di dati CSV che avete mostrato isn 't virgola-delimitato).

+0

Ho provato a utilizzare read.zoo ("C: /Users/ParamJeet/Desktop/test/eurusd.csv", sep = ",", tz = "", format = " % Y-% m-% d% H:% M ", intestazione = T) ma mi dà errore: Errore in read.zoo (" C: /Users/ParamJeet/Desktop/test/eurusd.csv ", sep = L'indice ",",: ha 13428 voci errate nelle righe di dati: 323559 323560 323561 323562 323563 – user395882

+0

Quindi date un'occhiata a quelle r ows in you csv - la mia ipotesi è che abbiano un formato diverso. –

+0

se apro il mio blocco note sembra Data, Aperto, Basso, Alto, Chiudi 2006-01-02 10: 01: 00,2822.9,2825.45,2822.1,2824.9 se apro in dati Excel si presenta come Data \t Aperto \t Basso \t alta \t Chiudi 1/2/2006 10:01 \t 2822,9 \t 2825,45 \t 2822,1 \t 2824,9 1/2/2006 10:02 2825,9 2824,95 questa pensare questa differenza causa il problema. – user395882

8

Anche se questo sembra essere un vecchio post, ma voglio condividere la mia esperienza da quando ho attraversato un processo molto frustrante simile cercando di caricare dati di serie temporali csv in R. Il problema di cui sopra è che Excel cambia il formato di la data e l'ora al seguente %m/%d/%Y %H:%M, in pratica si riducono i secondi. Se leggi un file con questo formato e hai una seconda risoluzione di dati ottieni più combinazioni di data e ora simili. quindi non puoi semplicemente usare il formato che ignora i secondi perché dà il seguente messaggio di errore. "la stringa di caratteri non è in un formato standard non ambiguo"

La soluzione è tornare su excel e modificare il formato della colonna dell'ora della data in %m/%d/%Y %H:%M:%S. È possibile farlo scegliendo i formati predefiniti di data e ora più vicini al formato desiderato (in questo caso è %m/%d/%Y %H:%M e quindi aggiungere manualmente :ss alla fine. Salvare il file come file csv e quindi leggerlo utilizzando il seguente comando:

Data<-read.zoo("file.csv", tz="", header=TRUE,format='%m/%d/%Y %H:%M:%S') 

questo ha funzionato per me e ho letto un file che ha circa 900K righe.

0

leggere il file senza usare as.xtc, quando la colonna data è come un personaggio. e poi convertire le date in classe POSIXlt con questa funzione:

library("chron") 
DateConvert<-function(x){ 
    dt<-strsplit(x,split = "T") 
    dt<-unlist(dt) 
    d1<-dt[1:length(dt) %% 2==1 ] 
    d2<-dt[1:length(dt) %% 2==0 ] 
    a<-as.POSIXlt(chron(dates.=d1, times.=d2, format = c(dates = "y-m-d", times = "h:m:s"))) 
    return(a) 
} 

DateConvert('Your column') 

e solo allora usa la funzione as.xts sui tuoi dati.