Wie kann ich eine XTS-Zeitreihe in R erneut abtasten?


9

Ich habe eine unregelmäßig verteilte XTSZeitreihe (mit POSIXctWerten als Indextyp).

Wie kann ich eine neue Zeitreihe erstellen, die in einem Intervall von beispielsweise 10 Minuten abgetastet wird, wobei jedoch jeder Abtastzeitpunkt auf eine runde Zeit ausgerichtet ist (13:00:00, 13:10:00, 13:20:00, ...)? . Wenn ein Resampling-Moment nicht genau auf einen ursprünglichen Serienwert fällt, möchte ich den vorherigen nehmen.


Könnten Sie ein Beispiel geben?
Joshua Ulrich

2
Wenn es jemals eine Liste mit häufig gestellten Fragen zu xts geben würde, würde dies sehr gut abschneiden. Bitte schauen Sie sich hier um, suchen [r] xtsund durchsuchen Sie die R-Sig-Finance-Archive.
Dirk Eddelbuettel

Antworten:


5
library(xts)
?endpoints

Zum Beispiel

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

alle 20 Minuten zu unterproben. Vielleicht haben Sie auch prüfen wollen to.minutes, to.dailyusw.


Es gibt nur ein kleines Problem - wenn ich ..., 14:59, 15:00, ... habe, wird es 14:59 und nicht 15:00 abrufen, wie ich möchte. Gibt es eine Möglichkeit, um 15:00 Uhr zurückzukehren? Ich habe so etwas versucht "seconds", 3601, aber es funktioniert nicht
Meh

Da die Zeitstempel unregelmäßig sind, kann nur zwischen Datenpunkten eine Garantie für den dt übernommen werden. Die tatsächlichen Punkte hängen vom Startpunkt der Serie ab. Wenn Sie Ihren Startpunkt auf eine runde Stunde festlegen, verhält er sich so, wie Sie möchten ... (vorausgesetzt, Sie haben alle N Minuten Punkte)
Dr. G

Dies ist genau das, was ich nicht will - abhängig vom ersten Punkt
Meh

2

Ich bin mir immer noch nicht sicher, was Sie versuchen, und ich denke immer noch, dass ein Beispiel helfen würde, aber ich dachte, ich würde vermuten, dass Sie daran interessiert sind align.time.

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

Berücksichtigen Sie alle Zeitreihen - Außentemperatur. Ich möchte wissen, wie hoch die Temperatur um 11:00 Uhr Wanduhr, um 12:00 Uhr Wanduhr, ... Ich werde Ihr Beispiel später überprüfen, um zu sehen, ob dies der Fall ist
Meh

Soweit ich das beurteilen kann, wollte Adal diese Anwendung von align.time nach der Verwendung von Endpunkten (abgesehen von seiner Erwähnung, "die vorherige" in der ursprünglichen Frage zu verwenden). Wie auch immer, es ist das, was ich wollte, also danke, Joshua.
Rahul Savani

Gibt es eine Version von align.time, aber zum Abrunden, nicht zum Aufrunden? Es macht auch genau das, was ich will, aber dafür. (Übrigens habe ich einen groben Weg: Wenn a1 mein XTS-Objekt ist und ich auf Minutenintervalle abrunden möchte, dann index(a1)=index(a1)-60;align.time(a1,60))
Darren Cook

1
@DarrenCook: Es gibt keine Version davon align.time, die das macht. Unabhängig davon scheint es eine schlechte Idee zu sein, Beobachtungen auf eine Zeit vor ihrem Auftreten abzustimmen.
Joshua Ulrich

2
@JoshuaUlrich Ein Beispiel ist die Umwandlung von Finanz-Ticks in einen Balken. 08:00 steht für die Minute von 08:00:00 bis 08:00:59. 08:00 als Stundenbalken steht für 08:00:00 bis 08:59:59. (Es stimmt dann mit der Funktionsweise der täglichen Bars überein, wobei 2011-11-25 den Handel am 2011-11-25 und nicht am 2011-11-24 darstellt.) Ich denke, dies war das gleiche Verhalten, das das OP wollte.
Darren Cook

1

Wenn aes sich um ein xts-Objekt mit Einträgen für die zweite Auflösung handelt, werden alle Sekunden gelöscht: index (a) = trunc (index (a), "min")

Sie können dies auch verwenden, um die Auflösung auf "Stunden" abzurunden. 10 Minuten werden jedoch nicht unterstützt. Dafür müssen Sie Folgendes tun:

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

Oder a=align.time.down(a,600)wo Sie definiert haben:

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

(Ich habe diese letzte Wahl in meinem eigenen Skript getroffen.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.