Leer XTS del archivo CSV en R
-
26-09-2019 - |
Pregunta
Estoy tratando de leer la serie de tiempo de archivo CSV y guardarlos como xts a ser capaz de procesarlas con quantmod. El problema es que los valores numéricos no se analizan.
archivo CSV:
name;amount;datetime
test1;3;2010-09-23 19:00:00.057
test2;9;2010-09-23 19:00:00.073
código R:
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)
Resultados:
name amount
2010-09-23 19:00:00 "test1" "3"
2010-09-23 19:00:00 "test2" "9"
Véase la columna cantidad contiene datos de caracteres, pero se espera que sea numérico. ¿Qué hay de malo en mi código?
Solución
La estructura de datos interna de ambos zoo
y xts
es matrix
, por lo que no se pueden mezclar tipos de datos.
acabamos de leer en los datos con read.table
:
Data <- read.table("file.csv", sep=";", header=TRUE, colClasses=ColClasses)
Me notar que sus datos tienen subseconds, por lo que puede estar interesado en xts::align.time
. Este código se llevará a Data
y crear un objeto con una columna para cada "name"
por segundo.
NewData <- do.call( merge, lapply( split(Data,Data$name), function(x) {
align.time( xts(x[,"amount"],as.POSIXct(x[,"datetime"])), n=1 )
}) )
Si desea crear objetos test1
y test2
en su entorno global, puede hacer algo como:
lapply( split(Data,Data$name), function(x) {
assign(x[,"name"], xts(x[,"amount"],as.POSIXct(x[,"datetime"])),envir=.GlobalEnv)
})
Otros consejos
No se puede mezclar datos numéricos y el carácter de un objeto zoológico o XTS; Sin embargo, si la columna nombre no pretende ser series temporales de datos sino que está destinada a distinguir entre múltiples series de tiempo, uno para test1, uno para test2, etc, entonces se puede dividir en la columna 1, utilizando dividida = 1 para causar tales división como se muestra en el código siguiente. Asegúrese de ajustar los digits.secs o de lo contrario no verá la sub-segundos en la salida (a pesar de que estarán allí en cualquier caso):
options(digits.secs = 3)
z <- read.zoo("myfile.csv", sep = ";", split = 1, index = 3, header = TRUE, tz = "")
x <- as.xts(z)