2017-01-20 4 views
2

У меня есть данные временного ряда, отснятые со скоростью 10 минут. Я хочу разбить его по часам, но, к моему удивлению, split.xts не дает ожидаемых результатов. Шаги используются:Сплит временные ряды данных почасово в R

library(xts) 
set.seed(123) 
Sys.setenv(TZ="Asia/Kolkata") 
timeind <- seq(as.POSIXct("2017-01-20 00:00:00 IST"), 
       as.POSIXct("2017-01-20 23:59:59 IST"),by="10 min") #for indexing 
df <- xts(runif(length(timeind),30,50),timeind) #xts data frame 
split(df,"hours",k=1) 

ВЫХОД ЕСТЬ:

[[1]] 
         [,1] 
2017-01-20 00:00:00 31.24343 
2017-01-20 00:10:00 32.57921 
2017-01-20 00:20:00 40.17684 

[[2]] 
         [,1] 
2017-01-20 00:30:00 41.89185 
2017-01-20 00:40:00 30.93997 
2017-01-20 00:50:00 31.76651 
2017-01-20 01:00:00 49.07364 
2017-01-20 01:10:00 34.79113 
2017-01-20 01:20:00 48.13881 

Ожидаемый результат:

[[1]] 
         [,1] 
2017-01-20 00:00:00 31.24343 
2017-01-20 00:10:00 32.57921 
2017-01-20 00:20:00 40.17684 
2017-01-20 00:30:00 41.89185 
2017-01-20 00:40:00 30.93997 
2017-01-20 00:50:00 31.76651 

[[2]] 
2017-01-20 01:00:00 49.07364 
2017-01-20 01:10:00 34.79113 
2017-01-20 01:20:00 48.13881 
... 

Почему split.xts не работает должным образом?

+0

или вы используете base 'split()' с 'lubridate :: hour':' split (df, lubridate :: hour (timeind)) '. однако вывод будет списком объектов 'zoo'. – mtoto

+0

вы также можете посмотреть пакет 'padr' – Aramis7d

ответ

2

Это known bug. Если часовой пояс индекса является таковым, который не является смещением по часовой стрелке от UTC, endpoints работает некорректно (поскольку его расчеты основаны на UTC).

Например, Азия/Калькутта UTC + 0530, поэтому endpoints выровняется по полчаса.

Возможным обходным шагом было бы добавить 30 минут к индексу перед вызовом split, а затем вычесть 30 минут от каждого элемента результата. Хотя это может вызвать проблемы в летнее время, если часовой пояс наблюдает один.

df_adjusted <- df 
.index(df_adjusted) <- .index(df_adjusted) - 60 * 30 
by_hour <- lapply(split(df_adjusted, "hours"), 
      function(x) { .index(x) <- .index(x) + 60 * 30; x }) 
Смежные вопросы