Leggi XTS da file CSV in R
-
26-09-2019 - |
Domanda
Sto cercando di leggere serie tempo file CSV e salvarli come XTS essere in grado di elaborarli con quantmod. Il problema è che i valori numerici non vengono analizzati.
file CSV:
name;amount;datetime
test1;3;2010-09-23 19:00:00.057
test2;9;2010-09-23 19:00:00.073
Codice 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)
Risultato:
name amount
2010-09-23 19:00:00 "test1" "3"
2010-09-23 19:00:00 "test2" "9"
Vedere importo colonna contiene dati di carattere, ma dovrebbe essere numerico. Cosa c'è di sbagliato con il mio codice?
Soluzione
La struttura interna dei dati di entrambi zoo
e xts
è matrix
, quindi non è possibile mescolare i tipi di dati.
Basta leggere i dati con read.table
:
Data <- read.table("file.csv", sep=";", header=TRUE, colClasses=ColClasses)
I notare i dati hanno, frazioni di secondo, così si può essere interessati a xts::align.time
. Questo codice avrà Data
e creare un oggetto con una colonna per ogni "name"
dai secondi.
NewData <- do.call( merge, lapply( split(Data,Data$name), function(x) {
align.time( xts(x[,"amount"],as.POSIXct(x[,"datetime"])), n=1 )
}) )
Se si desidera creare oggetti test1
e test2
nel vostro ambiente globale, si può fare qualcosa di simile:
lapply( split(Data,Data$name), function(x) {
assign(x[,"name"], xts(x[,"amount"],as.POSIXct(x[,"datetime"])),envir=.GlobalEnv)
})
Altri suggerimenti
Non è possibile combinare i dati numerici e carattere in un oggetto zoo o XTS; Tuttavia, se la colonna nome non è destinato ad essere dati di serie temporali, ma è piuttosto volta a distinguere tra più serie temporali, uno per test1, uno per test2, ecc allora si può dividere in colonna 1 utilizzando split = 1 per provocare tale suddivisione come mostrato nel seguente codice. Assicurarsi di impostare le digits.secs, altrimenti non sarà possibile vedere i sub-secondi su uscita (anche se ci saranno, in ogni caso):
options(digits.secs = 3)
z <- read.zoo("myfile.csv", sep = ";", split = 1, index = 3, header = TRUE, tz = "")
x <- as.xts(z)