web-dev-qa-db-fra.com

Conversion d'un bloc de données en xts

J'essaie de convertir un bloc de données en objet xts en utilisant la méthode as.xts () -. Voici mon dataframe d'entrée 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

Le résultat est:

> as.xts(q)
Error in as.POSIXlt.character(x, tz, ...) : 
  character string is not in a standard unambiguous format

C'est l'exemple le plus simple auquel je puisse penser, donc c'est assez frustrant de ne pas le faire fonctionner ... Toute aide est appréciée!

47
user442446

Ceci est clairement documenté --- xts et Zoo les objets sont formés en fournissant deux arguments, un vector ou matrix portant des données et un type Date, POSIXct, chron, ... fournissant les informations de temps (ou dans le cas de Zoo la commande).

Alors fais quelque chose comme

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

et vous devriez être prêt.

74
Dirk Eddelbuettel

Eh bien, as.xts suppose par défaut que les dates sont stockées dans les noms de domaine du data.frame. D'où le message d'erreur. Une solution rapide et sale est:

rownames(q) = q[1]
as.xts(q)

Mais vous obtenez une colonne supplémentaire avec la chaîne de dates. Idéalement, vous construisez le data.frame avec les dates comme noms de départ pour commencer.

19
Dr G

Voici une solution utilisant le package tidyquant, qui contient une fonction as_xts() qui contraint une trame de données à un objet xts. Il contient également as_tibble() pour contraindre les objets xts à tibbles (trames de données "bien rangées").

Recréez la trame de données (notez que la classe date-heure est utilisée dans les trames de données "bien rangées", mais n'importe quelle classe de date ou d'heure sans ambiguïté peut être utilisée):

> 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

Utilisez as_xts() pour convertir en classe "xts". Spécifiez l'argument, date_col = t, Pour désigner la colonne "t" comme dates à utiliser comme noms de ligne:

> 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

Le retour est un objet xts avec la date ou les heures-date appropriées comme noms de ligne.

6
Matt Dancho

Voici une solution possible:

library(timetk)
q <- xts::xts(q[,-1], order.by = q$t)
0
Gregory Lopez