2016-11-21 3 views
1

Таким образом, у меня есть временная серия xts в течение года с часовым поясом «UTC». Интервал между каждой строкой составляет 15 минут.period.apply более часа с решающим временем начала

     x1 x2 
2014-12-31 23:15:00 153.0 0.0 
2014-12-31 23:30:00 167.1 5.4 
2014-12-31 23:45:00 190.3 4.1 
2015-01-01 00:00:00 167.1 9.7 

Как я хочу данных в течение одного часа, чтобы для сравнения с другими наборами данных, я пытался использовать period.apply:

dat <- period.apply(dat, endpoints(dat,on="hours",k=1), colSums) 

Проблема в том, что первая строка в моем новом наборе данных является 2014-12-31 23:45:00 и не 2015-01-01 00:00:00. Я попытался изменить вектор конечной точки, но почему-то продолжает говорить, что он выходит за пределы. Я также подумал, что это мой ответ: https://stats.stackexchange.com/questions/5305/how-to-re-sample-an-xts-time-series-in-r/19003#19003, но это не так. Я не хочу менять имена моих столбцов, я хочу суммировать их на другом интервале.

Здесь воспроизводимый пример:

library(xts) 
seq<-seq(from=ISOdate(2014,12,31,23,15),length.out = 100, by="15 min", tz="UTC") 
xts<-xts(rep(1,100),order.by = seq) 
period.apply(xts, endpoints(xts,on="hours",k=1), colSums) 

И результат выглядит следующим образом:

2014-12-31 23:45:00 3 
2015-01-01 00:45:00 4 
2015-01-01 01:45:00 4 
2015-01-01 02:45:00 4 

и заканчивается так:

2015-01-01 21:45:00 4 
2015-01-01 22:45:00 4 
2015-01-01 23:45:00 4 
2015-01-02 00:00:00 1 

В то время как я хотел бы, чтобы это всегда сумма за тот же интервал, то есть я хотел бы только 4s. (я использую RStudio 0.99.903 с R x64 3.3.2)

+0

Возможно, кто-то может помочь вам, если вы предоставите образцы данных, которые воспроизводят вашу проблему. См. Http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example или http://meta.stackexchange.com/questions/176460/how-to-paste-data -from-r-to-stackoverflow – FXQuantTrader

+0

Спасибо за ваши предложения. Я попытался сделать это яснее! – Daldal

ответ

1

Проблема в том, что вы используете endpoints, но вы хотите выровнять по начала интервала, а не конец. Я думал, что вы сможете использовать this startpoints function, но это принесло странные результаты.

Основная идея обхода ниже - вычесть небольшую сумму из всех значений индекса, а затем использовать endpoints и period.apply для агрегирования. Затем наберите align.time. Я не уверен, что это общее решение, но, похоже, оно работает для вашего примера.

library(xts) 
seq<-seq(from=ISOdate(2014,12,31,23,15),length.out = 100, by="15 min", tz="UTC") 
xts<-xts(rep(1,100),order.by = seq) 
# create a temporary object 
tmp <- xts 
# subtract a small amount of time from each index value 
.index(tmp) <- .index(tmp)-0.001 
# aggregate to hourly 
agg <- period.apply(tmp, endpoints(tmp, "hours"), colSums) 
# round index up to next hour 
agg_aligned <- align.time(agg, 3600)