Lesen Sie xts aus CSV-Datei in R
-
26-09-2019 - |
Frage
Ich versuche, Zeitreihen aus CSV-Datei und speichern Sie sie zu lesen, wie xts Lage sein, sie mit quantmod zu verarbeiten. Das Problem ist, dass numerische Werte werden nicht analysiert.
CSV-Datei:
name;amount;datetime
test1;3;2010-09-23 19:00:00.057
test2;9;2010-09-23 19:00:00.073
R Code:
library(xts)
ColClasses = c("character", "numeric", "character")
Data <- read.zoo("c:\\dat\\test2.csv", index.column = 3, sep = ";", header = TRUE, FUN = as.POSIXct, colClasses = ColClasses)
as.xts(Data)
Ergebnis:
name amount
2010-09-23 19:00:00 "test1" "3"
2010-09-23 19:00:00 "test2" "9"
Siehe Menge Spalte enthält Datenzeichen aber erwartet numerisch zu sein. Was ist falsch mit meinem Code?
Lösung
Die interne Datenstruktur sowohl zoo
und xts
ist matrix
, so dass Sie nicht Datentypen mischen.
Lesen Sie einfach in den Daten mit read.table
:
Data <- read.table("file.csv", sep=";", header=TRUE, colClasses=ColClasses)
ich feststellen, dass Ihre Daten haben Millisekunden, so dass Sie in xts::align.time
interessiert sein könnten. Dieser Code wird Data
nehmen und ein Objekt mit einer Spalte für jeden "name"
von Sekunden erstellen.
NewData <- do.call( merge, lapply( split(Data,Data$name), function(x) {
align.time( xts(x[,"amount"],as.POSIXct(x[,"datetime"])), n=1 )
}) )
Wenn Sie Objekte test1
und test2
im globalen Umfeld schaffen möchten, können Sie so etwas tun:
lapply( split(Data,Data$name), function(x) {
assign(x[,"name"], xts(x[,"amount"],as.POSIXct(x[,"datetime"])),envir=.GlobalEnv)
})
Andere Tipps
Sie können nicht numerisch und Zeichendaten in einem Zoo oder xts Objekt mischen; jedoch, wenn der Namensspalte ist nicht als Zeitreihendaten bestimmt, sondern soll zwischen mehreren Zeitreihen, eine für test1, eine für test2 unterscheiden, usw., dann können Sie auf Spalte geteilt 1 Split mit 1 = solche Spaltung verursachen wie in dem folgenden Code dargestellt. Sicherstellen, dass die digits.secs setzen oder sonst werden Sie nicht die Unter Sekunden auf Ausgang sehen (obwohl sie auf jeden Fall da sein wird):
options(digits.secs = 3)
z <- read.zoo("myfile.csv", sep = ";", split = 1, index = 3, header = TRUE, tz = "")
x <- as.xts(z)