2012-02-21 27 views
15

Pracuję w R i czyta csv, który ma datę i godzinę w swojej pierwszej kolumnie. Chcę najpierw zaimportować ten plik csv w R, a następnie przekonwertować go na zoo.Czytanie csv z datą i czasem

Używam kod w R

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

moim pliku csv zawierają dane w formacie:

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 

Kiedy uruchomić powyższe polecenie, aby zaimportować dane do RI uzyskać folowwwing błąd:

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

Próbowałem znaleźć wszystkie sposoby rozwiązania problemu. Czytałem tak wiele blogów przez sieć, ale żadna z metod nie działa dla mnie.

Mam nadzieję, że ktoś mi pomoże.

+1

Wygląda na to, że w kolumnie z datą jest coś, co ją budzi. Prawdopodobnie bezpańskie puste miejsce "-", ",", "n.a" czy coś takiego. –

+0

Czy jesteś pewien, że 'sep' to przecinek?Twój przykładowy format pliku CSV wygląda jak karta? –

+0

To jest przecinek oddzielony. Otwieram plik csv w notatniku i wyraźnie widać przecinek rozdzielony – user395882

Odpowiedz

5

Wygląda na to, że błąd wynika z faktu, że R nie rozpoznaje formatu, w którym znajduje się twoja kolumna z datą (nie może wyliczyć - data/miesiąc/rok? Miesiąc/data/rok? Itd.).

Możesz określić, jakiego formatu używasz, używając argumentu format do read.zoo (zob. ?strptime dla specyfikacji, których możesz użyć).

Na przykład, jeżeli została data/miesiąc/rok godzinnym (24-godzinny): minuta, można zrobić:

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

(Uwaga - w swoim pytaniu fragment danych csv pokazałeś ISN 't rozdzielane przecinkami).

+0

Próbowałem używać read.zoo ("C: /Users/ParamJeet/Desktop/test/eurusd.csv", sep = ",", tz = "", format = " % Y-% m-% d% H:% M ", header = T), ale daje mi błąd: Błąd w read.zoo (" C: /Users/ParamJeet/Desktop/test/eurusd.csv ", sep = ",",: indeks ma 13428 złe wpisy w wierszach danych: 323559 323560 323561 323562 323563 – user395882

+0

Następnie spójrz na te r W waszym CSV - domyślam się, że mają inny format. –

+0

jeśli otworzę mój notatnik wygląda jak data, otwarta, niska, wysoka, zamknij 2006-01-02 10: 01: 00,2822.9,2825.45,2822.1,2824,9 jeśli otworzę w Excelu dane wyglądają jak data \t otwórz \t niski \t Wysoka \t Close 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 Ten myśleć tę różnicę przyczyną problemu. – user395882

8

Mimo to wydaje się być stary post, ale chcę podzielić się moim doświadczeniem, odkąd przeszedł podobny proces bardzo frustrujące próbuje załadować dane seria csv czasu na R. powyżej Problemem jest to, że Excel zmienia format data i godzina do następnej %m/%d/%Y %H:%M, w zasadzie to upuszcza sekundy. Jeśli czytasz plik w tym formacie i masz dane o drugiej rozdzielczości, otrzymujesz wiele kombinacji dat, które są podobne. więc nie można po prostu użyć formatu, który ignoruje sekundy, ponieważ wyświetla następujący komunikat o błędzie. "ciąg znaków nie ma standardowego, jednoznacznego formatu"

Rozwiązaniem jest powrót do formatu Excel i zmiana formatu kolumny daty na %m/%d/%Y %H:%M:%S. Możesz to zrobić, wybierając domyślny format daty najbliższej daty do żądanego formatu (w tym przypadku jest to %m/%d/%Y %H:%M, a następnie ręcznie dodaj na końcu :ss. Zapisz plik jako plik csv, a następnie odczytaj go, używając następującej komendy:

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

Ten pracował dla mnie i odczytać plik, który ma około 900K wiersze.

0

Przeczytaj plik bez użycia as.xtc, gdy kolumna data jest jak postać. a potem przekonwertować daty do klasy POSIXlt z tą funkcją:

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') 

i właśnie wtedy używaj funkcji as.xts na twoich danych.

Powiązane problemy