Convertir un marco de datos a xts
dataframe coerce (3)
Estoy tratando de convertir un marco de datos a un objeto xts usando el método as.xts (). Aquí está mi marco de datos de entrada q:
q
t x
1 2006-01-01 00:00:00 1
2 2006-01-01 01:00:00 2
3 2006-01-01 02:00:00 3
str(q)
''data.frame'': 10 obs. of 2 variables:
$ t: POSIXct, format: "2006-01-01 00:00:00" "2006-01-01 01:00:00" "2006-01-01 02:00:00" "2006-01-01 03:00:00" ...
$ x: int 1 2 3 4 5 6 7 8 9 10
El resultado es:
> as.xts(q)
Error in as.POSIXlt.character(x, tz, ...) :
character string is not in a standard unambiguous format
Este es el ejemplo más simple en el que puedo pensar, así que es bastante frustrante no hacer que funcione ... ¡Se agradece cualquier ayuda!
Aquí hay una solución que utiliza el paquete tidyquant
, que contiene una función as_xts()
que coacciona un marco de datos a un objeto xts. También contiene as_tibble()
para forzar objetos xts a tibbles (marcos de datos "ordenados").
Recrear el marco de datos (tenga en cuenta que la clase de fecha y hora se utiliza en marcos de datos "ordenados", pero se puede usar cualquier clase de fecha u hora sin ambigüedad):
> q
# A tibble: 3 × 2
t x
<dttm> <dbl>
1 2006-01-01 00:00:00 1
2 2006-01-01 01:00:00 2
3 2006-01-01 02:00:00 3
Usa as_xts()
para convertir a la clase "xts". Especifique el argumento, date_col = t
, para designar la columna "t" como las fechas para usar como nombres de fila:
> library(tidyquant)
> as_xts(q, date_col = t)
x
2006-01-01 00:00:00 1
2006-01-01 01:00:00 2
2006-01-01 02:00:00 3
La devolución es un objeto xts
con la fecha o fecha-hora correctas como nombres de filas.
Bueno, as.xts asume por defecto que las fechas se almacenan en los rownames del data.frame. De ahí el mensaje de error. Una solución rápida y sucia es:
rownames(q) = q[1]
as.xts(q)
Pero obtienes una columna extra con la cadena de fechas. Lo ideal sería construir el data.frame con las fechas como rownames para comenzar.
Esto está claramente documentado xts zoo objetos xts y zoo se forman mediante el suministro de dos argumentos, un vector
o matrix
lleva datos y Date
, POSIXct
, POSIXct
, ... tipo que proporciona la información de tiempo (o en el caso de zoo el pedido).
Entonces haz algo como
qxts <- xts(q[,-1], order.by=q[,1])
y deberías estar listo.