Come ricampionare una serie temporale XTS in R?


9

Ho una XTSserie temporale distanziata in modo irregolare (con POSIXctvalori come tipo di indice).

Come posso costruire una nuova serie temporale campionata a intervalli di 10 minuti, ma con ogni momento del campione allineato a un tempo di round (13:00:00, 13:10:00, 13:20:00, ...) . Se un momento di ricampionamento non cade esattamente sul valore di una serie originale, voglio prendere quello precedente.


Potresti fornire un esempio?
Joshua Ulrich,

2
Se ci fosse mai un elenco di domande frequenti su xts, questo avrebbe un punteggio elevato. Per favore, guardati intorno, cerca [r] xtse consulta gli archivi di r-sig-finance.
Dirk Eddelbuettel,

Risposte:


5
library(xts)
?endpoints

Per esempio

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

sottocampionare ogni 20 minuti. Si potrebbe anche voler controllare to.minutes, to.dailyecc


C'è solo un piccolo problema: se ho ..., 14:59, 15:00, ..., recupererà le 14:59 e non le 15:00 come vorrei. C'è un modo per farlo tornare alle 15:00? Ho provato qualcosa del genere "seconds", 3601, ma non funziona
Meh

Dal momento che i timestamp sono irregolari, si possono fare solo garanzie sul dt tra i punti dati. I punti effettivi dipendono dal punto iniziale della serie. Se fissi il tuo punto di partenza su un'ora rotonda, si comporterà come preferisci ... (supponendo di avere punti ogni N minuti)
Dr G

Questo è esattamente ciò che non voglio - essendo dipendente dal primo punto
Meh

2

Non sono ancora sicuro di quello che stai cercando di fare e penso ancora che un esempio possa essere d'aiuto, ma ho pensato di indovinare che potresti essere interessato align.time.

# Compare this:
tmp[endpoints(tmp, "minutes", 20)]
# with this:
align.time( tmp[endpoints(tmp, "minutes", 20)], n=60*20 )

Prendi in considerazione qualsiasi serie temporale - temperatura esterna. Voglio sapere qual è la temperatura alle 11:00 orologio da parete, alle 12:00 orologio da parete, .... Controllerò il tuo esempio più tardi per vedere se lo fa
Meh

Per quanto posso dire, questa applicazione di align.time dopo aver usato gli endpoint è ciò che Adal voleva (a parte la sua menzione di prendere "il precedente" nella domanda originale). Ad ogni modo, è quello che volevo, quindi grazie, Joshua.
Rahul Savani,

Esiste una versione di align.time ma per arrotondare per difetto, non per eccesso? Fa anche esattamente quello che voglio, ma per quello. (A proposito, ho un modo rozzo: se a1 è il mio oggetto XTS e voglio arrotondare a intervalli di minuti, allora index(a1)=index(a1)-60;align.time(a1,60))
Darren Cook

1
@DarrenCook: non esiste una versione align.timeche lo faccia. Indipendentemente da ciò, sembra una cattiva idea allineare le osservazioni con un tempo precedente al loro verificarsi.
Joshua Ulrich,

2
@JoshuaUlrich Un esempio è la conversione di tick finanziari in una barra. 08:00 rappresenta il minuto dalle 08:00:00 alle 08:00:59. 08:00 come barra delle ore rappresenta 08:00:00 a 08:59:59. (È quindi coerente con il modo in cui funzionano le barre giornaliere, dove il 25/11/2011 rappresenta il trading il 25/11/2011 e non il 24/11/2011.) Penso che questo fosse lo stesso comportamento che l'OP voleva.
Darren Cook,

1

Se aè un oggetto xts con voci per la seconda risoluzione, questo cancella tutti i secondi: index (a) = trunc (index (a), "mins")

Puoi anche usarlo per arrotondare alla risoluzione "ore". Ma 10 minuti non sono supportati. Per questo devi fare questo:

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

O a=align.time.down(a,600)dove hai definito:

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

(Sono andato con l'ultima scelta nella mia sceneggiatura.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.