2010-11-28 18 views
38

Ich versuche, einen Datenrahmen zu XTS-Objekt mit der as.xts() - Methode zu konvertieren. Hier ist mein Eingangsdatenrahmen q:Konvertieren eines Datenrahmens in xts

q 
         t x 
1 2006-01-01 00:00:00 1 
2 2006-01-01 01:00:00 2 
3 2006-01-01 02:00:00 3 

str(q) 
    'data.frame': 10 obs. of 2 variables: 
$ t: POSIXct, format: "2006-01-01 00:00:00" "2006-01-01 01:00:00" "2006-01-01 02:00:00" "2006-01-01 03:00:00" ... 
$ x: int 1 2 3 4 5 6 7 8 9 10 

Das Ergebnis ist:

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

Dies ist das einfachste Beispiel, das ich mich vorstellen kann, so dass es ziemlich frustrierend ist nicht immer daran zu arbeiten ... Jede Hilfe ist geschätzt!

Antwort

15

Nun, as.xts nimmt standardmäßig an, dass die Daten in den Rownames des data.frames gespeichert werden. Daher die Fehlermeldung. Eine schnelle und dreckige Lösung ist:

rownames(q) = q[1] 
as.xts(q) 

Aber Sie erhalten eine zusätzliche Spalte mit der Daten Zeichenfolge. Im Idealfall würden Sie den data.frame mit den Datumsangaben als roownames erstellen.

+1

Wahrscheinlich sollte: 'rownames (q) = q [[1]]' –

+0

@ 42, was wäre der Unterschied? – Ahmedov

+0

@Ahmedov 'q [1]' wäre eine Liste mit einem Vektor. 'q [[1]]' wäre nur der Vektor. Könnte keinen Unterschied machen, wenn '[<-. Rownames 'eine Liste akzeptiert, aber selbst wenn dies der Fall ist, tun dies nicht alle klassenspezifischen Zuweisungsfunktionen. –

55

Dies wird eindeutig dokumentiert --- xts und zoo Objekte werden durch Zuführen zwei Argumente ausgebildet ist, ein oder vectormatrix Trag Daten und Date, POSIXct, chron ... Art der Zeitinformation (oder in dem Fall liefert von zoo die bestellung).

So etwas wie

qxts <- xts(q[,-1], order.by=q[,1]) 

und Sie sollten eingestellt werden.

+3

Danke! Du hast mir sehr geholfen, obwohl die Antwort so einfach war! (Es war für mich nicht offensichtlich, weil ich keines der Zeitreihenpakete zuvor benutzt habe und irgendwie nicht aus der Dokumentation herausbekommen habe). Aber, nochmals vielen Dank! – user442446

+14

Ich denke nicht, dass es all das offensichtlich ist, auch wenn man bedenkt, dass das 'xts: Extensible Time Series' Papier eindeutig behauptet, dass eine Konvertierung von data.frame möglich ist. – frankc

+8

Fügen Sie mich als ein anderer hinzu, der nicht glaubt, dass es tatsächlich "klar dokumentiert" ist. Aber dank dieser Antwort konnte ich etwas anderes herausfinden, das nichts mit der ursprünglichen Frage zu tun hat. – atomicules

5

Hier ist eine Lösung mit dem tidyquant Paket, das eine Funktion as_xts() enthält, die einen Datenrahmen zu einem XTS-Objekt erzwingt. Es enthält auch as_tibble(), um xts-Objekte zu tibbles ("saubere" Datenrahmen) zu zwingen.

den Datenrahmen neu erstellen (beachten Sie, dass die Datum-Zeit-Klasse in „ordentlich“ Datenrahmen verwendet wird, aber jede eindeutige Datum oder Datum kann Zeitklasse verwendet werden):

> q 
# A tibble: 3 × 2 
        t  x 
       <dttm> <dbl> 
1 2006-01-01 00:00:00  1 
2 2006-01-01 01:00:00  2 
3 2006-01-01 02:00:00  3 

Verwenden as_xts() zu konvertieren "xts" -Klasse. Geben Sie das Argument, date_col = t, die „t“ Spalte zu bezeichnen, wie die Daten, als Zeilennamen zu verwenden:

> library(tidyquant) 
> as_xts(q, date_col = t) 
        x 
2006-01-01 00:00:00 1 
2006-01-01 01:00:00 2 
2006-01-01 02:00:00 3 

Die Rück ein xts Objekt mit dem richtigen Datum oder Datum-mal als Zeilenname ist.

Verwandte Themen