Объединить несколько столбцов на основе получасовых временных рядов - PullRequest
0 голосов
/ 12 марта 2019

У меня есть временные ряды с разрешением 5 минут, и я хотел бы объединить (усреднить) все значения в пределах 30-минутных интервалов для каждой переменной категории (X / Y / Z).

Я нашел много потоковздесь, на SO, но ни один из них не агрегирует каждые полчаса, и я не представляю, как объединить получасовую агрегацию со вторым столбцом.Кроме того, я был бы признателен, если бы было решение для data.table из-за превосходной производительности.Исходные таблицы состоят из нескольких миллионов строк с тысячами категорий.

Мои данные выглядят так:

+---------------------+------+------------+
|      Timestamp      | DUID | Meter_Prod |
+---------------------+------+------------+
| 2018-03-01 00:00:00 | X    |          1 |
| 2018-03-01 00:00:00 | Y    |          2 |
| 2018-03-01 00:00:00 | Z    |          3 |
| 2018-03-01 00:05:00 | X    |          1 |
| 2018-03-01 00:05:00 | Y    |          2 |
| 2018-03-01 00:05:00 | Z    |          3 |
| ...                 |      |            |
| 2018-03-01 00:55:00 | X    |          1 |
| 2018-03-01 00:55:00 | Y    |          2 |
| 2018-03-01 00:55:00 | Z    |          3 |
+---------------------+------+------------+

Я хотел бы иметь это

+---------------------+------+--------------------+
|      Timestamp      | DUID | Meter_Prod_Average |
+---------------------+------+--------------------+
| 2018-03-01 00:00:00 | X    |                  1 |
| 2018-03-01 00:00:00 | Y    |                  2 |
| 2018-03-01 00:00:00 | Z    |                  3 |
| 2018-03-01 00:30:00 | X    |                  1 |
| 2018-03-01 00:30:00 | Y    |                  2 |
| 2018-03-01 00:30:00 | Z    |                  3 |
+---------------------+------+--------------------+

Anпример кадра данных загружен здесь: https://pastebin.com/4bESGTKH

1 Ответ

0 голосов
/ 12 марта 2019

Вы можете попробовать data.table скользящее соединение. Создайте новую таблицу данных с нужными временными интервалами:

head(dt)
# Timestamp DUID Meter_Prod
# 1 2018-03-01 00:00:00    X         15
# 2 2018-03-01 00:00:00    Y        122
# 3 2018-03-01 00:00:00    Z          6
# 4 2018-03-01 00:05:00    X         15
# 5 2018-03-01 00:05:00    Y        122
# 6 2018-03-01 00:05:00    Z          6
start_time <- as.POSIXct('2018-03-01 00:00:00')
new_time <- data.table(Timestamp=seq.POSIXt(start_time,max(dt$Timestamp),by=30*60)) # Will be deleted during join
new_time[,ts:=Timestamp] # Will be preserved for grouping

Новая таблица должна иметь фиктивный столбец с такими же временными метками для объединения.

new_dt <- new_time[dt,on='Timestamp',roll=+Inf] #Join statement
new_dt[,.(Meter_Prod_Average=mean(Meter_Prod)),by=.(ts,DUID)] # Aggregation
#                      ts DUID Meter_Prod_Average
# 1: 2018-03-01 00:00:00    X                 15
# 2: 2018-03-01 00:00:00    Y                122
# 3: 2018-03-01 00:00:00    Z                  6
# 4: 2018-03-01 00:30:00    X                 15
# 5: 2018-03-01 00:30:00    Y                122
# ---                                            
#   140: 2018-03-01 23:00:00    Y                122
# 141: 2018-03-01 23:00:00    Z                  6
# 142: 2018-03-01 23:30:00    X               2696
# 143: 2018-03-01 23:30:00    Y                122
# 144: 2018-03-01 23:30:00    Z                  6

На основе аргумента roll в объединении вы можете изменять положение метки времени в интервале.

...