агрегировать значения столбцов с интервалами в 5 минут и создавать новый кадр - PullRequest
0 голосов
/ 25 августа 2018

У меня есть датафрейм как:

           T1            T2           T3             timestamp
          45.37        44.48            13 2015-11-05 10:23:00
          44.94        44.55         13.37 2015-11-05 10:24:00
          45.32        44.44         13.09 2015-11-05 10:27:00
          45.46        44.51         13.29 2015-11-05 10:28:00
          45.46        44.65         13.18 2015-11-05 10:29:16
          45.96        44.85         13.23 2015-11-05 10:32:00
          45.52        44.56         13.53 2015-11-05 10:36:00
          45.36        44.62         13.25 2015-11-05 10:37:00

Я хочу создать новый фрейм данных, который содержит пароли T1, T2 и T3, агрегированные за 5-минутные интервалы на основе столбца timestamp. Я наткнулся на aggregate, и он, кажется, использует один из столбцов для группировки / агрегирования соответствующих значений в других столбцах.

Если ни одна строка не имела значений в течение 5-минутного интервала, то строки, представляющие NA с. Мне также нравится другой столбец, в котором указано количество элементов, используемых для получения среднего значения за 5-минутные интервалы.

Ищете наиболее эффективный способ сделать это в R. Спасибо

1 Ответ

0 голосов
/ 25 августа 2018

Сначала убедитесь, что столбцы меток времени являются столбцами date.time.Вы можете пропустить эту строку, если она уже в этом формате.

df1$timestamp <- as.POSIXct(df1$timestamp)

xts имеет несколько полезных функций для работы с сериями времени.Специально для функций прокрутки или агрегации времени.В этом случае period.apply может помочь.

library(xts)

# create xts object. Be sure to exclude the timestamp column otherwise you end up with a character matrix. 
df1_xts <- as.xts(df1[, -4], order.by = df1$timestamp)

# sum per 5 minute intervals
df1_xts_summed <- period.apply(df1_xts, endpoints(df1_xts, on = "minutes", k = 5), colSums)

# count rows per 5 minute interval and add to data
df1_xts_summed$nrows <- period.apply(df1_xts$T1, endpoints(df1_xts, on = "minutes", k = 5), nrow)

df1_xts_summed 

                        T1     T2    T3 nrows
2015-11-05 10:24:00  90.31  89.03 26.37     2
2015-11-05 10:29:16 136.24 133.60 39.56     3
2015-11-05 10:32:00  45.96  44.85 13.23     1
2015-11-05 10:37:00  90.88  89.18 26.78     2

Если вы хотите вернуть все обратно в data.frame:

df_final <- data.frame(timestamp = index(df1_xts_summed), coredata(df1_xts_summed))
df_final

            timestamp     T1     T2    T3 nrows
1 2015-11-05 10:24:00  90.31  89.03 26.37     2
2 2015-11-05 10:29:16 136.24 133.60 39.56     3
3 2015-11-05 10:32:00  45.96  44.85 13.23     1
4 2015-11-05 10:37:00  90.88  89.18 26.78     2

Редактировать , если хотитевсе, округленное до 5 минут с этими временными метками, необходимо сделать следующим образом:

Первый шаг - заменить временные метки 5-минутными интервалами с учетом начальных минут временных меток.Для этого я использую ceiling_date из пакета lubridate и добавляю к нему разницу между первыми значениями метки времени и потолком первого значения метки времени.Это вернет последние значения каждого интервала.(Если вы хотите использовать начало интервала, вам нужно использовать floor_date)

df1$timestamp <- lubridate::ceiling_date(df1$timestamp, "5 mins") + difftime(lubridate::ceiling_date(first(df1$timestamp), "5 mins"), first(df1$timestamp), unit = "secs")

Далее тот же код XTS, что и раньше, который возвращает те же данные, но отметка времени теперь является последним значением5-минутные интервалы.

df1_xts <- as.xts(df1[, -4], order.by = df1$timestamp)
df1_xts_summed <- period.apply(df1_xts, ep, colSums)
df1_xts_summed$nrows <- period.apply(df1_xts$T1, endpoints(df1_xts, on = "minutes", k = 5), nrow)
df_final <- data.frame(timestamp = index(df1_xts_summed), coredata(df1_xts_summed))
df_final

            timestamp     T1     T2    T3 nrows
1 2015-11-05 10:27:00  90.31  89.03 26.37     2
2 2015-11-05 10:32:00 136.24 133.60 39.56     3
3 2015-11-05 10:37:00  45.96  44.85 13.23     1
4 2015-11-05 10:42:00  90.88  89.18 26.78     2

данные:

df1 <- structure(list(T1 = c(45.37, 44.94, 45.32, 45.46, 45.46, 45.96, 
45.52, 45.36), T2 = c(44.48, 44.55, 44.44, 44.51, 44.65, 44.85, 
44.56, 44.62), T3 = c(13, 13.37, 13.09, 13.29, 13.18, 13.23, 
13.53, 13.25), timestamp = c("2015-11-05 10:23:00", "2015-11-05 10:24:00", 
"2015-11-05 10:27:00", "2015-11-05 10:28:00", "2015-11-05 10:29:16", 
"2015-11-05 10:32:00", "2015-11-05 10:36:00", "2015-11-05 10:37:00"
)), class = "data.frame", row.names = c(NA, -8L))
...