wake-up-neo.net

Wie kann ich XTS in data.frame ändern und den Index beibehalten?

Ich besitze eine XTS-Zeitserie in R des folgenden Formats und versuche, vor dem Exportieren als CSV-Datei für die Arbeit in einem anderen Programm etwas zu verarbeiten, zu unterteilen und neu anzuordnen.

head(master_1)
                   S_1
2010-03-03 00:00:00 2.8520
2010-03-03 00:30:00 2.6945
2010-03-03 01:00:00 2.5685
2010-03-03 01:30:00 2.3800
2010-03-03 02:00:00 2.2225
2010-03-03 02:30:00 2.0650

und

str(master_1)
An ‘xts’ object from 2010-03-03 to 2010-05-25 08:30:00 containing:
  Data: num [1:4000, 1] 2.85 2.69 2.57 2.38 2.22 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr "S_1"
  Indexed by objects of class: [POSIXt,POSIXct] TZ: 
  Original class: 'Zoo'  
  xts Attributes:  
List of 1
 $ dateFormat: chr "Date"

Und ich möchte dies in ein data.frame konvertieren, damit ich es einfacher manipulieren und dann in ein anderes Programm exportieren kann. Wenn ich jedoch test1 <- as.data.frame(master_1) verwende, ist im Test1 der Index (d. H. Datum und Uhrzeit) sichtbar.

head(test1)
                       S_1
2010-03-03 00:00:00 2.8520
2010-03-03 00:30:00 2.6945
2010-03-03 01:00:00 2.5685
2010-03-03 01:30:00 2.3800
2010-03-03 02:00:00 2.2225
2010-03-03 02:30:00 2.0650 

Aber der Index wird nicht angezeigt,

str(test1)
'data.frame': 4000 obs. of  1 variable:
 $ S_1: num  2.85 2.69 2.57 2.38 2.22 ...

Beim Schreiben einer CSV-Datei write.csv(master_1, file="master_1.csv") werden Uhrzeit und Datum nicht berücksichtigt. Warum ist das so und wie kann ich die Daten/Zeitdaten als Spalte einfügen, damit sie in anderen R-Befehlen verwendet und ordnungsgemäß exportiert werden?

Danke für jede Hilfe.

27
phrozenpenguin

Das liegt daran, dass die Datumsangaben in Ihrem data.frame als Rownames bezeichnet werden. Sie müssen eine eigene Spalte erstellen. 

Versuche dies:

 data.frame(date=index(master_1), coredata(master_1))
48
Shane

Dies ist ein bisschen wie eine Seitenleiste, aber die Funktion fortify(...) im Paket ggplot2 konvertiert eine Vielzahl von Objekten in Datenrahmen, die für die Verwendung in ggplot(...) geeignet sind, einschließlich xts-Objekten.

library(xts)
set.seed(1)    # for reproducible example
master_1 <- xts(rnorm(10,mean=2,sd=0.1),as.POSIXct("2010-03-03")+30*(0:9))

library(ggplot2)
df <- fortify(master_1)
head(df)
#                  Index master_1
# 1  2010-03-03 00:00:00 1.937355
# 2  2010-03-03 00:00:30 2.018364
# 3  2010-03-03 00:01:00 1.916437
# 4  2010-03-03 00:01:30 2.159528
# 5  2010-03-03 00:02:00 2.032951
# 6  2010-03-03 00:02:30 1.917953

Wenn Sie gggplot bereits verwenden, können Sie dies auf einfache Weise tun. Beachten Sie, dass der Index in eine Spalte namens Index (Großbuchstabe "I") geht.

13
jlhoward

Da 1.9.6 Sie direkt von/nach xts konvertieren können, ohne die Indexklasse zu verlieren. So einfach wie: 

as.data.table(master_1)

Der Index wird als erste Spalte im Ergebnis data.table hinzugefügt. Er behält die Indexvariablen Date oder POSIXct bei.

5
jangorecki

Shane hat recht. Sie suchen möglicherweise nach Index (Ihre XTS). Hier ist ein reproduzierbares Beispiel.

library(xts)
example(xts)
x = head(sample.xts)
datefield = index(x)
newdf = data.frame(x,datefield)

Dann sollten Sie es einfach in eine CSV exportieren können. Natürlich können Sie auch die Zeilen umbenennen. 

1
Matt Bannert

Sie können ein xts-Objekt in einen data.frame konvertieren, der den Index als Spalte "Index" mit Zoo::fortify.Zoo() enthält.

Sie brauchen kein ggplot2, aber das funktioniert auch, wenn Sie xts (oder Zoo) und ggplot2 geladen haben.

Zum Beispiel:

library(xts)
data(sample_matrix)
x <- as.xts(sample_matrix, dateFormat = "Date")
my_df <- fortify.Zoo(x)
head(my_df)
#        Index     Open     High      Low    Close
# 1 2007-01-02 50.03978 50.11778 49.95041 50.11778
# 2 2007-01-03 50.23050 50.42188 50.23050 50.39767
# 3 2007-01-04 50.42096 50.42096 50.26414 50.33236
# 4 2007-01-05 50.37347 50.37347 50.22103 50.33459
# 5 2007-01-06 50.24433 50.24433 50.11121 50.18112
# 6 2007-01-07 50.13211 50.21561 49.99185 49.99185
str(my_df)
# 'data.frame': 180 obs. of  5 variables:
#  $ Index: Date, format: "2007-01-02" "2007-01-03" ...
#  $ Open : num  50 50.2 50.4 50.4 50.2 ...
#  $ High : num  50.1 50.4 50.4 50.4 50.2 ...
#  $ Low  : num  50 50.2 50.3 50.2 50.1 ...
#  $ Close: num  50.1 50.4 50.3 50.3 50.2 ...
0
Joshua Ulrich