【问题标题】:Aggregate multiple columns based on half-hourly time series根据半小时时间序列聚合多个列
【发布时间】:2019-08-02 18:11:53
【问题描述】:

我有一个分辨率为 5 分钟的时间序列,我想汇总(平均)每个类别 (X/Y/Z) 变量在 30 分钟间隔内的所有值。

我在 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

【问题讨论】:

标签: r dataframe data.table time-series


【解决方案1】:

您可以尝试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 参数,您可以改变时间戳在间隔中的位置。

【讨论】:

  • 嗯,有趣的是,如果我将转储转换为 data.table,则只有前 15 行在 data.table 中。抱歉,这有点跑题了。
  • @UDE_Student 在转换为 data.table 之前,您能否 unlist() DUID,除非有充分的理由保留字符向量的列表列而不是单个字符向量?
  • @Aurèle 是的,你是对的,我没有列出,但是数据表仍然是 11 行。
猜你喜欢
  • 2018-02-28
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 2023-03-07
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多