Jak ponownie próbkować szeregi czasowe XTS w R?

9

Mam nieregularnie rozmieszczone XTSszeregi czasowe (z POSIXctwartościami typu indeksu).

Jak mogę zbudować nową serię czasową próbkowaną z, powiedzmy, 10-minutowym interwałem, ale z każdym momentem próbki dopasowanym do rundy (13:00:00, 13:10:00, 13:20:00, ...) . Jeśli moment ponownego próbkowania nie spadnie dokładnie na oryginalną wartość serii, chcę wziąć poprzednią.

Meh
źródło
Czy możesz podać przykład?
Joshua Ulrich,
2
Gdyby kiedykolwiek była lista najczęściej zadawanych pytań dla xts, wynik byłby wysoki. Rozejrzyj się tutaj, wyszukaj [r] xtsi przeglądaj archiwa r-sig-finance.
Dirk Eddelbuettel,

Odpowiedzi:

5
library(xts)
?endpoints

Na przykład

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

do podpróbkowania co 20 minut. Warto również sprawdzić to.minutes, to.dailyitd

Dr G.
źródło
Jest tylko mały problem - jeśli mam ..., 14:59, 15:00, ... odzyska 14:59, a nie 15:00, jak bym chciał. Czy istnieje sposób, aby powrócić o 15:00? Próbowałem czegoś podobnego "seconds", 3601, ale to nie działa
Meh
Ponieważ znaczniki czasu są nieregularne, można zagwarantować tylko dt między punktami danych. Rzeczywiste punkty zależą od punktu początkowego serii. Jeśli ustawisz punkt początkowy na okrągłą godzinę, będzie on zachowywał się tak, jak chcesz ... (zakładając, że masz punkty co N minut)
Dr G
To jest dokładnie to, czego nie chcę - zależy od pierwszego punktu
Meh
2

Nadal nie jestem pewien, co próbujesz zrobić, i nadal uważam, że przykład by pomógł, ale pomyślałem, że możesz być zainteresowany align.time.

# Compare this:
tmp[endpoints(tmp, "minutes", 20)]
# with this:
align.time( tmp[endpoints(tmp, "minutes", 20)], n=60*20 )
Joshua Ulrich
źródło
Rozważ dowolne szeregi czasowe - temperatura zewnętrzna. Chcę wiedzieć, jaka jest temperatura o 11:00 zegar ścienny, o 12:00 zegar ścienny, .... Sprawdzę twój przykład później, aby zobaczyć, czy to robi
Meh
O ile mi wiadomo, ta aplikacja align.time po użyciu punktów końcowych jest tym, czego chciał Adal (oprócz tego, że wspomniał o wzięciu „poprzedniego” w pierwotnym pytaniu). W każdym razie tego właśnie chciałem, więc dziękuję, Joshua.
Rahul Savani
Czy istnieje wersja align.time, ale do zaokrąglania w dół, a nie w górę? Robi również dokładnie to, czego chcę, ale do tego. (BTW, mam prymitywny sposób: jeśli a1 jest moim obiektem XTS i chcę zaokrąglić w dół do minutowych odstępów, to index(a1)=index(a1)-60;align.time(a1,60))
Darren Cook
1
@DarrenCook: Nie ma wersji align.time, która to robi. Niezależnie od tego, wydaje się, że złym pomysłem jest zrównanie obserwacji z czasem poprzedzającym ich wystąpienie.
Joshua Ulrich
2
@JoshuaUlrich Jednym z przykładów jest zamiana haczyków finansowych na pasek. 08:00 oznacza minutę od 08:00:00 do 08:00:59. 08:00 jako bar godzinny reprezentuje 08:00:00 do 08:59:59. (Jest to zatem spójne z tym, jak działają codzienne bary, gdzie 2011-11-25 reprezentuje handel 2011-11-25, a nie 2011-11-24.) Myślę, że było to takie samo zachowanie, jakiego chciał OP.
Darren Cook
1

Jeśli ajest obiektem xts z wpisami do drugiej rozdzielczości, powoduje to wyłączenie wszystkich sekund: index (a) = trunc (index (a), "mins")

Możesz także użyć tego do zaokrąglenia w dół do rozdzielczości „godzin”. Ale 10 minut nie jest obsługiwane. W tym celu musisz to zrobić:

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

Lub a=align.time.down(a,600)gdzie zdefiniowałeś:

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

(wybrałem ten ostatni wybór w moim własnym skrypcie).

Darren Cook
źródło