Регулярный анализ нерегулярных временных рядов

У меня нерегулярный временной ряд (xts в R), к которому я хочу применить временные окна. Например, учитывая такой временной ряд, как следующий, я хочу вычислить такие вещи, как количество наблюдений в каждом дискретном 3-часовом окне, начиная с 2009-09-22 00:00:00:

library(lubridate)
s <- xts(c("OK", "Fail", "Service", "OK", "Service", "OK"),
         ymd_hms(c("2009-09-22 07:43:30", "2009-10-01 03:50:30",
                   "2009-10-01 08:45:00", "2009-10-01 09:48:15",
                   "2009-11-11 10:30:30", "2009-11-11 11:12:45")))

Я, по-видимому, не могу использовать period.apply() или split() для этого, потому что они будут пропускать периоды без наблюдений, и я не могу указать время начала.

Мой желаемый результат для простой задачи подсчета (хотя, конечно, мои реальные задачи сложнее с каждым сегментом!) Был бы примерно таким, если бы я суммировал 3 дня за раз:

2009-09-22    1
2009-09-25    0
2009-09-28    0
2009-10-01    3
2009-10-04    0
2009-10-07    0
2009-10-10    0
2009-10-13    0
2009-10-16    0
2009-10-19    0
2009-10-22    0
2009-10-25    0
2009-10-28    0
2009-10-31    0
2009-11-03    0
2009-11-06    0
2009-11-09    2

Спасибо за любые указания.


person Ken Williams    schedule 27.09.2011    source источник


Ответы (1)


Используйте align.time, чтобы поместить индекс s в интересующие вас периоды. Затем используйте period.apply, чтобы найти длину каждого 3-часового окна. Затем объедините его с пустым объектом xts, который имеет все нужные вам значения индекса.

# align index into 3-hour blocks
a <- align.time(s, n=60*60*3)
# find the number of obs in each block
count <- period.apply(a, endpoints(a, "hours", 3), length)
# create an empty xts object with the desired index
e <- xts(,seq(start(a),end(a),by="3 hours"))
# merge the counts with the empty object and fill with zeros
out <- merge(e,count,fill=0)
person Joshua Ulrich    schedule 27.09.2011
comment
Это не то, что я ищу - позвольте мне добавить подробностей к исходному вопросу. - person Ken Williams; 27.09.2011
comment
Возможно, идея merge() - это то, что мне нужно - создать последовательность с желаемыми конечными точками интервала, а затем объединить это в последовательность? - person Ken Williams; 27.09.2011