Subconjunto xts objeto por hora del día

Una pregunta simple: sé cómo subconjuntar series temporales en xts durante años, meses y días desde la ayuda: x['2000-05/2001'] etc.

Pero, ¿cómo puedo subconjuntar mis datos por horas del día? Me gustaría obtener toda la información entre las 7:00 a.m. y las 6:00 p.m. Es decir, quiero extraer los datos durante el horario comercial, irrelevantes para el día (me ocupo de los fines de semana más adelante). La ayuda tiene un ejemplo de la forma:

 .parseISO8601('T08:30/T15:00') 

Pero esto no funciona en mi caso. ¿Alguien tiene una pista?

Si su objeto xts se llama x entonces algo como y <- x["T09:30/T11:00"] me funciona para obtener un trozo de la sesión de la mañana, por ejemplo.

Por alguna razón, para cortar xts la hora del día usando x["T09:30/T11:00"] es bastante lento, utilizo el método de R: subconjunto de datos eficientemente en función de la hora del día y el subconjunto data.table time contra el tiempo xts subconjunto para hacer una función más rápida con una syntax similar:

 cut_time_of_day <- function(x, t_str_begin, t_str_end){ tstr_to_sec <- function(t_str){ #"09:00:00" to sec of day as.numeric(as.POSIXct(paste("1970-01-01", t_str), "UTC")) %% (24*60*60) } #POSIX ignores leap second #sec_of_day = as.numeric(index(x)) %% (24*60*60) #GMT only sec_of_day = {lt = as.POSIXlt(index(x)); lt$hour *60*60 + lt$min*60 + lt$sec} #handle tzone sec_begin = tstr_to_sec(t_str_begin) sec_end = tstr_to_sec(t_str_end) return(x[ sec_of_day >= sec_begin & sec_of_day <= sec_end,]) } 

Prueba:

 n = 100000 dtime <- seq(ISOdate(2001,1,1), by = 60*60, length.out = n) attributes(dtime)$tzone <- "CET" x = xts((1:n), order.by = dtime) y2 <- cut_time_of_day(x,"07:00:00", "09:00:00") y1 <- x["T07:00:00/T09:00:00"] identical(y1,y2)