Вы можете попробовать 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
в объединении вы можете изменять положение метки времени в интервале.