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.