2010-11-28 12 views
38

Estoy tratando de convertir un marco de datos a un objeto xts usando el método as.xts(). Aquí está mi trama de datos de entrada q:Convirtiendo un marco de datos a xts

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 que puedo pensar, por lo que es muy frustrante no conseguir que funcione ... Cualquier ayuda es ¡apreciado!

Respuesta

15

Bueno, as.xts asume por defecto que las fechas se almacenan en los nombres de fila 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 se obtiene una columna adicional con la cadena de fechas. Lo ideal sería construir el data.frame con las fechas como rownames para comenzar.

+1

Probablemente debería ser: 'rownames (q) = q [[1]]' –

+0

@ 42, ¿cuál sería la diferencia? – Ahmedov

+0

@Ahmedov 'q [1]' sería una lista que contiene un vector. 'q [[1]]' sería el vector. Puede que no importe si '[<-. Rownames' acepta una lista, pero incluso si lo hace, no todas las funciones de asignación específicas de clase lo hacen. –

55

Esto es claramente documentados --- xts y zoo objetos están formados mediante el suministro de dos argumentos, una vector o matrix transporte de datos y Date, POSIXct, chron, ... Tipo de suministro de la información de tiempo (o en el caso de zoo el pedido).

Así que hacer algo como

qxts <- xts(q[,-1], order.by=q[,1]) 

y que debe establecerse.

+3

Gracias! Me ayudaste mucho, ¡aunque la respuesta fue muy simple! (No fue obvio para mí, porque no he usado ninguno de los paquetes de series de tiempo antes y de alguna manera no lo obtuve de la documentación). Pero, gracias de nuevo! – user442446

+14

No creo que sea tan obvio, ya sea porque el documento 'xts: Extensible Time Series' claramente afirma que la conversión de data.frame es posible. – frankc

+8

Agrégame como otro que no piense que es eso "claramente documentado" en realidad. Pero gracias a esta respuesta logré entender algo más que no estaba relacionado con la pregunta original. – atomicules

5

Aquí hay una solución que usa 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").

Volver a crear la trama de datos (tenga en cuenta que la clase de fecha y hora se utiliza en tramas de datos "ordenado", pero ninguna fecha y fecha de la clase de tiempo sin ambigüedades se puede utilizar):

> 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 

Uso as_xts() para convertir a clase "xts" Especificar el argumento, date_col = t, para designar la columna "t" como las fechas para usar como nombres de las filas:

> 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 

El retorno es un objeto xts con la fecha correcta o fecha-veces como nombres de las filas.