2017-10-30 1 views
0

Mein data frame ist ‚mydata‘ genannt und es hat nur zwei Spalten und sieht wie folgt aus:Was mache ich falsch bei der Konvertierung meines Datenrahmens in xts für die Zeitreihenanalyse?

Date   Sales 
2016-07-01 51256 
2016-08-01 75892 
2016-09-01 67115 
... 

Ausführen des folgenden Code str(mydata) gibt mir folgendes:

'data.frame': 28 obs. of 2 variables: 
$ DATE : chr "2016-07-01" "2016-08-01" "2016-09-01" ... 
$ PKGREV: num 51256 75892 67115 ... 

Ich habe den folgenden Bibliotheken geladen in R:

Ich verstehe, dass ich die Spalte "Datum" in Daten zuerst vor konvertieren muss e macht die xts Umwandlung. Von den 2 Stackoverflow Fragen unten (siehe Links unten), habe ich diese zwei Versuche gemacht:

Versuch 1:

mydata2 <- xts(mydata[,-1], order.by=mydata[,1])  


Error message: 

Error in xts(mydata[, -1], order.by = mydata[, 1]) : 
order.by requires an appropriate time-based object 

Versuch 2:

mydata2 <- xts(mydata[, -1], order.by=as.POSIXct(mydata$Date)) 

Error message: 

Error in as.POSIXct.default(mydata$Date) : 
do not know how to convert 'mydata$Date' to class “POSIXct” 

Stackoverflow Fragen konsultiert:

Converting a data frame to xts

Converting data.frame to xts order.by requires an appropriate time-based object

Was bin ich hier?

+0

verwenden Haben Sie versucht, mit fliessendem 'mydata $ Date <- as.Date (mydata $ Date)' zuerst? – Jaap

+0

Wenn ich den Code ausführen, den Sie erwähnen, erhalte ich die folgende Fehlermeldung: "Fehler in as.Date.default (Mydata $ Date): weiß nicht, wie" Mydata $ Date "in Klasse" Date "konvertieren – user3115933

+0

Bitte überprüfen . [MCVE] –

Antwort

1

Sie die ymd Funktion aus dem Paket lubridate verwenden können Strings Daten zu konvertieren. Dann können Sie tk_xts von timetk

library(dplyr) 
library(timetk) 
library(lubridate) 

mydata %>% 
    mutate(Date = ymd(Date)) %>% 
    tk_xts(select = Sales) 
+0

bekomme ich folgende Fehlermeldung: wenn Sie den Code ausgeführt wird: Spalte 'DATE' für date_var Verwendung Nachricht. Achtung: In tk_xts_.data.frame (data = Daten, wählen Sie = select, date_var = date_var,: Nichtnumerische Spalten werden gelöscht: DATE – user3115933

+0

Die Warnung ist kein Problem, ich habe die Antwort bearbeitet, indem ich die Spalte ausgewählt habe, damit Sie die Warnung nicht mehr sehen können – amarchin

+0

Mein Problem ist, dass die erste Spalte nach dem Konvertieren in xts nicht funktioniert habe eine Kopfzeile Ich brauche noch die Spalte, um die Überschrift "Datum" zu haben. Meldung, wenn ich jetzt den Code ausführe: Verwendung der Spalte 'DATE' für date_var. – user3115933

0

Ein paar Anmerkungen zu der Frage:

  • Es scheint, dass Sie nicht den Zeitindex zu "Date" Klasse konvertieren haben - Sie abwechselnd "yearmon" Klasse, wenn die Daten monatlich ist verwenden könnte.

  • bezüglich Versuch 2, sollten Sie nicht "POSIXt" für Daten Datum. Das wird Sie der Möglichkeit von Zeitzonencodierungsfehlern unnötig aussetzen. Solche Fehler können subtil und daher schwer zu erkennen sein. Wenn Sie trotzdem "POSIXt" verwenden, verwenden Sie "POSIXct" Klasse und nicht "POSIXlt" Klasse.

  • basierend auf Ihrem Kommentar gibt es Aspekte der Daten, die Sie nicht in der Frage zeigten. Im Folgenden haben wir ein in sich abgeschlossenes, reproduzierbares Beispiel und zwei alternative Codesätze vorgestellt, die beide funktionieren. Sie müssen feststellen, wie sich Ihr Setup davon unterscheidet.

Um die Lösungen unter umluftunabhängigem halten wir verwenden Lines wie in der Anmerkung am Ende definiert, aber sie text=Lines mit Ihren Dateinamen ersetzen könnten, zum Beispiel "mydata.dat".

Die erste unten angegebene Alternative verwendet read.zoo, um die Daten in ein Klassenobjekt "zoo" zu lesen, das dann in ein Klassenobjekt "xts" konvertiert wird. read.zoo konvertiert automatisch die erste Spalte in die "Date" Klasse (es sei denn, Sie verwenden andere Argumente). Das Zoo-Paket wird automatisch vom xts-Paket geladen.

Die folgende zweite Alternative liest die Daten in einen Datenrahmen DF und verwendet dann xts(), um das zweite Argument in die "Date" Klasse zu konvertieren.

library(xts) 

# 1 
z <- read.zoo(text = Lines, header = TRUE) 
as.xts(z) 

# 2 
DF <- read.table(text = Lines, header = TRUE) 
with(DF, xts(Sales, as.Date(Date))) 

yearmon

Wenn Sie "yearmon" Klasse statt "Date" Klasse dann in der ersten Alternative Gebrauch

x <- read.zoo(text = Lines, header = TRUE, FUN = as.yearmon) 

und in der zweiten verwenden wollte:

with(DF, xts(Sales, as.yearmon(Date))) 

Hinweis: Der Eingang, Lines, in reproduzierbarer Form ist:

Lines <- " 
Date   Sales 
2016-07-01 51256 
2016-08-01 75892 
2016-09-01 67115"