我有一个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 |
+---------------------+------+--------------------+
示例数据框上传到此处:https://pastebin.com/4bESGTKH
答案 0 :(得分:0)
您可以尝试data.table
滚动加入。使用所需的时间间隔创建一个新的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
参数,您可以更改时间间隔的时间戳记位置。