padr в R: заполнение с заданным пользователем интервалом

Я работаю с данными временных рядов с 5-минутными интервалами времени. Некоторые из 5-минутных временных рядов отсутствуют. Я хотел бы пересмотреть набор данных, чтобы заполнить недостающие 5-минутные периоды значениями NaN. Я нашел отличную информацию о том, как подойти к этому здесь: R: Вставить строки для пропущенных дат / времени.

Я создал data.frame "df" со столбцом временных рядов POSIXct "time".

Функция pad в пакете padr позволяет пользователю установить интервал по минутам, часам, дням и т. Д.

интервал
Интервал возвращаемой переменной datetime. Когда NULL, интервал> будет равен интервалу переменной datetime. Если указано, оно может быть> только ниже, чем интервал входных данных. Смотрите подробности.

Функция padr padr создаст 1-минутные интервалы для моих 5-минутных данных. Как мне установить свой собственный пользовательский интервал (например, 5 минут)?

3 ответа

Решение

Вчера вышла новая версия CRAN. Теперь вы можете использовать единицы, отличные от 1 в каждом из интервалов

library(padr)
library(dplyr)
coffee %>% thicken("5 min") %>% select(-time_stamp) %>% pad()

Хотя я не мог заставить решение Пьера работать с моим форматом данных (который я не помог в определении), я смог создать решение, используя стратегию Пьера в выборе 5-минутного подмножества дополненного 1-минутного интервала. данные. Я взволнован этой новой библиотекой padr и надеюсь, что в будущем будет добавлена ​​дополнительная функциональность.

Моя стратегия была следующей:

library(padr)
library(zoo)
dfpad <- pad(df, interval = "min") #resample timeseries df to 1 min intervals
dfpadzoo <- zoo(dfpad,order.by = dfpad$time) #convert padded df to zoo timeseries
sensStart <- start(dfpadzoo) #first time in data using zoo function
sensEnd <- end(dfpadzoo) # last time in data using zoo function
nexttime <- df$time[2] #identify the time in the second data row
#determine time interval in minutes:
tint_min <- as.double(difftime(nexttime,sensStart, tz="UTC",units="mins"))
#Generate regularly-spaced time series from the start to end of data:
timeFill <- seq(from = as.POSIXct(sensStart, tz="UTC"),
                to = as.POSIXct(sensEnd, tz="UTC"), by = 60*tint_min)
#Create subset of dfpad spaced at 5-minute intervals
sensdatazoo <- dfpadzoo[timeFill]

Преобразовав df в объект зоопарка, я смог использовать дополнительные функциональные возможности временных рядов, найденные в библиотеке зоопарка.

Попробуйте использовать функцию, чтобы заполнить до минуты, а затем агрегировать в спецификации, которую вы хотите после. Это тогда приводит к пользовательскому резюме

library(padr)
account <- data.frame(day     = as.Date(c('2016-10-21', '2016-10-23', '2016-10-26')),
                      balance = c(304.46, 414.76, 378.98))

account %>% 
  pad('min') %>%   ##pad to the minute
  mutate(five_min = cut(day, "5 min")) %>%   ##create new 'five_min' column
  group_by(five_min) %>%     ## group by the new col
  summarise(ttl = sum(balance, na.rm=TRUE))  ##aggregate the new sum
# # A tibble: 1,441 × 2
#               five_min    ttl
#                 <fctr>  <dbl>
# 1  2016-10-21 00:00:00 304.46
# 2  2016-10-21 00:05:00   0.00
# 3  2016-10-21 00:10:00   0.00
# 4  2016-10-21 00:15:00   0.00
# 5  2016-10-21 00:20:00   0.00
# 6  2016-10-21 00:25:00   0.00
# 7  2016-10-21 00:30:00   0.00
# 8  2016-10-21 00:35:00   0.00
# 9  2016-10-21 00:40:00   0.00
# 10 2016-10-21 00:45:00   0.00
# # ... with 1,431 more rows
Другие вопросы по тегам