Como amostrar novamente uma série temporal do XTS no R?

9

Eu tenho uma XTSsérie temporal irregularmente espaçada (com POSIXctvalores como tipo de índice).

Como criar uma nova série temporal amostrada em um intervalo de 10 minutos, digamos, mas com cada momento da amostra alinhado a um tempo redondo (13:00:00, 13:10:00, 13:20:00, ...) . Se um momento de reamostragem não cair exatamente em um valor de série original, quero pegar o anterior.

Meh
fonte
Você poderia dar um exemplo?
Joshua Ulrich
2
Se alguma vez houve uma lista de FAQs para xts, isso teria uma pontuação alta. Por favor, olhe por aqui, pesquise [r] xtse examine os arquivos do r-sig-finance.
Dirk Eddelbuettel

Respostas:

5
library(xts)
?endpoints

Por exemplo

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

subamostrar a cada 20 minutos. Você também pode querer verificar para fora to.minutes, to.dailyetc.

Dr G
fonte
Existe apenas um pequeno problema - se eu tiver ..., 14:59, 15:00, ..., ele recuperará 14:59 e não 15:00 como eu gostaria. Existe uma maneira de fazê-lo retornar 15:00? Eu tentei algo parecido "seconds", 3601, mas ele não funciona
Meh
Como os carimbos de data / hora são irregulares, só é possível garantir garantias no intervalo entre pontos de dados. Os pontos reais dependem do ponto inicial da série. Se você fixar seu ponto de partida em uma hora redonda, ele se comportará como você gosta ... (supondo que você tenha pontos a cada N minutos)
Dr. G
Isto é exatamente o que eu não quero - sendo dependente do primeiro ponto
Meh
2

Ainda não tenho certeza do que você está tentando fazer e ainda acho que um exemplo ajudaria, mas achei que poderia estar interessado align.time.

# Compare this:
tmp[endpoints(tmp, "minutes", 20)]
# with this:
align.time( tmp[endpoints(tmp, "minutes", 20)], n=60*20 )
Joshua Ulrich
fonte
Considere qualquer série temporal - temperatura externa. Quero saber qual é a temperatura às 11:00, relógio de parede, 12:00, relógio de parede, .... Vou verificar seu exemplo mais tarde para ver se ele faz isso
Meh
Até onde eu sei, essa aplicação de align.time após o uso de endpoints é o que Adal queria (além de mencionar a menção de usar "o anterior" na pergunta original). Enfim, é o que eu queria, então obrigado, Joshua.
Rahul Savani
Existe uma versão do align.time, mas para arredondar para baixo, não para cima? Também faz exatamente o que eu quero, mas para isso. (BTW, eu tenho uma maneira bruta: se a1 é meus XTS objeto e eu quero descer rodada para intervalos de um minuto, em seguida, index(a1)=index(a1)-60;align.time(a1,60))
Darren Cozinhe
11
@ DarrenCook: Não existe uma versão align.timedisso que faça isso. Independentemente disso, parece uma má idéia alinhar as observações com um tempo anterior à sua ocorrência.
Joshua Ulrich
2
@JoshuaUlrich Um exemplo é a conversão de ticks financeiros em um bar. 08:00 representa o minuto de 08:00:00 a 08:00:59. 08:00 como uma barra horária representa 08:00:00 para 08:59:59. (Ele é consistente com o funcionamento das barras diárias, onde 25/11/2011 representa a negociação em 25/11/2011 e não em 24/11/2011.) Acho que esse era o mesmo comportamento que o OP desejava.
Darren Cozinhe
1

Se afor um objeto xts com entradas para a segunda resolução, isso interrompe todos os segundos: index (a) = trunc (index (a), "mins")

Você também pode usar isso para arredondar para a resolução "horas" também. Mas 10 minutos não são suportados. Para isso você tem que fazer o seguinte:

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

Ou a=align.time.down(a,600)onde você definiu:

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

(fui com essa última opção no meu próprio script.)

Darren Cook
fonte