Comment rééchantillonner une série temporelle XTS dans R?

9

J'ai une XTSsérie chronologique irrégulièrement espacée (avec des POSIXctvaleurs comme type d'index).

Comment puis-je créer une nouvelle série temporelle échantillonnée à un intervalle de 10 minutes, par exemple, mais avec chaque instant d'échantillonnage aligné sur une heure ronde (13:00:00, 13:10:00, 13:20:00, ...) . Si un moment de rééchantillonnage ne tombe pas exactement sur une valeur de série d'origine, je veux prendre le précédent.

Meh
la source
Pourriez-vous fournir un exemple?
Joshua Ulrich
2
S'il y avait jamais une liste de FAQ pour xts, cela marquerait très bien. Veuillez regarder ici, chercher [r] xtset parcourir les archives de r-sig-finance.
Dirk Eddelbuettel

Réponses:

5
library(xts)
?endpoints

Par exemple

tmp=zoo(rnorm(1000), as.POSIXct("2010-02-1")+(1:1000)*60)
tmp[endpoints(tmp, "minutes", 20)]

pour sous-échantillonner toutes les 20 minutes. Vous pouvez également consulter to.minutes, to.dailyetc.

Dr G
la source
Il n'y a qu'un petit problème - si j'ai ..., 14:59, 15:00, ..., il récupérera 14:59 et non 15:00 comme je le voudrais. Existe-t-il un moyen de le faire revenir à 15h00? J'ai essayé quelque chose comme ça "seconds", 3601, mais ça ne marche pas
Meh
Les horodatages étant irréguliers, on ne peut que garantir le dt entre les points de données. Les points réels dépendent du point de départ de la série. Si vous fixez votre point de départ à une heure ronde, il se comportera comme vous le souhaitez ... (en supposant que vous avez des points toutes les N minutes)
Dr G
C'est exactement ce que je ne veux pas - être dépendant du premier point
Meh
2

Je ne sais toujours pas ce que vous essayez de faire et je pense toujours qu'un exemple aiderait, mais j'ai pensé que je pourrais vous intéresser align.time.

# Compare this:
tmp[endpoints(tmp, "minutes", 20)]
# with this:
align.time( tmp[endpoints(tmp, "minutes", 20)], n=60*20 )
Joshua Ulrich
la source
Tenez compte de toute série chronologique - température extérieure. Je veux savoir quelle est la température à 11h00 horloge murale, à 12h00 horloge murale, .... Je vérifierai votre exemple plus tard pour voir si cela fait
Meh
Pour autant que je sache, cette application de align.time après avoir utilisé des points de terminaison était ce que voulait Adal (à part en ce qui concerne sa mention de prendre "le précédent" dans la question d'origine). Quoi qu'il en soit, c'est ce que je voulais, alors merci Joshua.
Rahul Savani
Existe-t-il une version de align.time mais à arrondir, pas à monter? Il fait aussi exactement ce que je veux mais pour ça. (BTW, j'ai une manière grossière: si a1 est mon objet XTS et que je veux arrondir à des intervalles d'une minute, alors index(a1)=index(a1)-60;align.time(a1,60))
Darren Cook
1
@DarrenCook: Il n'y a pas de version align.timequi fasse ça. Quoi qu'il en soit, il semble être une mauvaise idée d'aligner les observations sur une période antérieure à leur occurrence.
Joshua Ulrich
2
@JoshuaUlrich Un exemple est la conversion des ticks financiers en bar. 08:00 représente la minute de 08:00:00 à 08:00:59. 08:00 comme une barre d'heures représente 08:00:00 à 08:59:59. (Cela correspond alors à la façon dont les barres quotidiennes fonctionnent, où 2011-11-25 représente le commerce le 2011-11-25 et non le 2011-11-24.) Je pense que c'était le même comportement que le PO voulait.
Darren Cook
1

Si aest un objet xts avec des entrées en seconde résolution, cela supprime toutes les secondes: index (a) = trunc (index (a), "mins")

Vous pouvez également l'utiliser pour arrondir à la résolution "heures" également. Mais 10 minutes ne sont pas pris en charge. Pour cela, vous devez faire ceci:

x=as.POSIXlt(index(a))
x$sec[]=0;x$min[]=x$min[]%/%10
index(a)=x

Ou a=align.time.down(a,600)là où vous avez défini:

align.time.down=function(x,n){index(x)=index(x)-n;align.time(x,n)}

(J'ai choisi ce dernier choix dans mon propre script.)

Darren Cook
la source