J'ai une série temporelle XTS en format R du format suivant et j'essaie d'effectuer certains traitements, sous-paramétrages et réorganisations avant d'exporter en tant que CSV pour un travail dans un autre programme.
head(master_1)
S_1
2010-03-03 00:00:00 2.8520
2010-03-03 00:30:00 2.6945
2010-03-03 01:00:00 2.5685
2010-03-03 01:30:00 2.3800
2010-03-03 02:00:00 2.2225
2010-03-03 02:30:00 2.0650
et
str(master_1)
An ‘xts’ object from 2010-03-03 to 2010-05-25 08:30:00 containing:
Data: num [1:4000, 1] 2.85 2.69 2.57 2.38 2.22 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr "S_1"
Indexed by objects of class: [POSIXt,POSIXct] TZ:
Original class: 'Zoo'
xts Attributes:
List of 1
$ dateFormat: chr "Date"
Et j'aimerais convertir ceci en un fichier data.frame afin de pouvoir le manipuler plus facilement, puis l'exporter vers un autre programme. Cependant, lorsque j'utilise test1 <- as.data.frame(master_1)
, le test1 a l'index (c'est-à-dire les dates et heures) visible,
head(test1)
S_1
2010-03-03 00:00:00 2.8520
2010-03-03 00:30:00 2.6945
2010-03-03 01:00:00 2.5685
2010-03-03 01:30:00 2.3800
2010-03-03 02:00:00 2.2225
2010-03-03 02:30:00 2.0650
Mais l'index n'est pas affiché,
str(test1)
'data.frame': 4000 obs. of 1 variable:
$ S_1: num 2.85 2.69 2.57 2.38 2.22 ...
Et écrire une csv write.csv(master_1, file="master_1.csv")
n'inclut pas l'heure ni la date. Pourquoi est-ce cela et comment puis-je inclure les données data/time sous forme de colonne, afin qu’elles soient utilisées dans d’autres commandes R et exportées correctement?
Merci pour toute aide.
C'est parce que les dates sont des noms de domaine dans votre data.frame. Vous devez en faire une colonne séparée.
Essaye ça:
data.frame(date=index(master_1), coredata(master_1))
Ceci est un peu une barre latérale, mais la fonction fortify(...)
dans le package ggplot2
convertira une variété d’objets en trames de données utilisables dans ggplot(...)
, y compris les objets xts
.
library(xts)
set.seed(1) # for reproducible example
master_1 <- xts(rnorm(10,mean=2,sd=0.1),as.POSIXct("2010-03-03")+30*(0:9))
library(ggplot2)
df <- fortify(master_1)
head(df)
# Index master_1
# 1 2010-03-03 00:00:00 1.937355
# 2 2010-03-03 00:00:30 2.018364
# 3 2010-03-03 00:01:00 1.916437
# 4 2010-03-03 00:01:30 2.159528
# 5 2010-03-03 00:02:00 2.032951
# 6 2010-03-03 00:02:30 1.917953
Donc, si vous utilisez déjà gggplot
c'est un moyen facile de le faire. Notez que l'index va dans une colonne nommée Index
(majuscule "I").
Depuis 1.9.6
Vous pouvez convertir directement de/en xts
sans perdre la classe d'index. Aussi simple que:
as.data.table(master_1)
L'index est ajouté en tant que première colonne du résultat data.table
. Il conserve les classes d'index Date
ou POSIXct
.
Shane a raison. vous pourriez être à la recherche d'index (vos xts). Voici un exemple reproductible.
library(xts)
example(xts)
x = head(sample.xts)
datefield = index(x)
newdf = data.frame(x,datefield)
Ensuite, vous devriez pouvoir simplement l'exporter vers un fichier csv. Bien sûr, vous pouvez également renommer les lignes.
Vous pouvez convertir un objet xts en un fichier data.frame contenant l'index sous la forme d'une colonne nommée "Index" avec Zoo::fortify.Zoo()
.
Vous n'avez pas besoin de ggplot2, mais cela fonctionnera quand même si vous avez chargé xts (ou Zoo) et ggplot2.
Par exemple:
library(xts)
data(sample_matrix)
x <- as.xts(sample_matrix, dateFormat = "Date")
my_df <- fortify.Zoo(x)
head(my_df)
# Index Open High Low Close
# 1 2007-01-02 50.03978 50.11778 49.95041 50.11778
# 2 2007-01-03 50.23050 50.42188 50.23050 50.39767
# 3 2007-01-04 50.42096 50.42096 50.26414 50.33236
# 4 2007-01-05 50.37347 50.37347 50.22103 50.33459
# 5 2007-01-06 50.24433 50.24433 50.11121 50.18112
# 6 2007-01-07 50.13211 50.21561 49.99185 49.99185
str(my_df)
# 'data.frame': 180 obs. of 5 variables:
# $ Index: Date, format: "2007-01-02" "2007-01-03" ...
# $ Open : num 50 50.2 50.4 50.4 50.2 ...
# $ High : num 50.1 50.4 50.4 50.4 50.2 ...
# $ Low : num 50 50.2 50.3 50.2 50.1 ...
# $ Close: num 50.1 50.4 50.3 50.3 50.2 ...