¿Cómo volver a muestrear una serie temporal XTS en R?

9

Tengo una XTSserie temporal irregularmente espaciada (con POSIXctvalores como tipo de índice).

¿Cómo puedo construir una nueva serie de tiempo muestreada en un intervalo de 10 minutos, digamos, pero con cada momento de muestra alineado a un tiempo de ronda (13:00:00, 13:10:00, 13:20:00, ...) . Si un momento de remuestreo no cae exactamente en un valor de serie original, quiero tomar el anterior.

Meh
fuente
Podría dar un ejemplo?
Joshua Ulrich
2
Si alguna vez hubo una lista de preguntas frecuentes para xts, esto obtendría un puntaje alto. Mire por aquí, busque [r] xtsy lea detenidamente los archivos de r-sig-finance.
Dirk Eddelbuettel

Respuestas:

5
library(xts)
?endpoints

Por ejemplo

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

submuestras cada 20 minutos. Es posible que también desee comprobar hacia fuera to.minutes, to.daily, etc.

Dr. G
fuente
Solo hay un pequeño problema: si tengo ..., 14:59, 15:00, ..., recuperará 14:59 y no 15:00 como me gustaría. ¿Hay alguna manera de hacer que regrese a las 15:00? Intenté algo así "seconds", 3601, pero no funciona
Meh
Como las marcas de tiempo son irregulares, solo se pueden hacer garantías en el dt entre puntos de datos. Los puntos reales dependen del punto de partida de la serie. Si fija su punto de partida en una hora redonda, se comportará como desee ... (suponiendo que tenga puntos cada N minutos)
Dr G
Esto es exactamente lo que no quiero: depender del primer punto
Meh
2

Todavía no estoy seguro de lo que estás tratando de hacer y sigo pensando que un ejemplo podría ayudar, pero pensé que supongo que te puede interesar align.time.

# Compare this:
tmp[endpoints(tmp, "minutes", 20)]
# with this:
align.time( tmp[endpoints(tmp, "minutes", 20)], n=60*20 )
Joshua Ulrich
fuente
Considere cualquier serie de tiempo: temperatura exterior. Quiero saber cuál es la temperatura a las 11:00 reloj de pared, a las 12:00 reloj de pared, .... Voy a comprobar su ejemplo más adelante para ver si se hace esto
Meh
Por lo que puedo decir, esta aplicación de align.time después de usar puntos finales es lo que Adal quería (aparte de considerar su mención de tomar "el anterior" en la pregunta original). De todos modos, es lo que quería, así que gracias, Joshua.
Rahul Savani
¿Existe una versión de align.time pero redondear hacia abajo, no hacia arriba? También hace exactamente lo que quiero pero para eso. (Por cierto, tengo una forma cruda: si a1 es mi objeto XTS y quiero redondear a intervalos de minutos, entonces index(a1)=index(a1)-60;align.time(a1,60))
Darren Cook
1
@DarrenCook: No hay una versión de align.timeeso que haga eso. De todos modos, parece una mala idea alinear las observaciones con un tiempo anterior a su ocurrencia.
Joshua Ulrich el
2
@JoshuaUlrich Un ejemplo es convertir los ticks financieros en un bar. 08:00 representa el minuto de 08:00:00 a 08:00:59. 08:00 como una barra de hora representa 08:00:00 a 08:59:59. (Entonces es coherente con la forma en que funcionan las barras diarias, donde el 2011-11-25 representa el comercio el 2011-11-25 no el 2011-11-24.) Creo que este fue el mismo comportamiento que quería el OP.
Darren Cook
1

Si aes un objeto xts con entradas a una segunda resolución, esto desactiva todos los segundos: index (a) = trunc (index (a), "mins")

También puede usar esto para redondear a una resolución de "horas". Pero 10 minutos no son compatibles. Para eso tienes que hacer esto:

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

O a=align.time.down(a,600)donde has definido:

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

(Me he ido con esa última opción en mi propio guión).

Darren Cook
fuente