pandas 根据函数结果groupby时间序列数据

pandas groupby timeseries data according to function result

我正在分析电力系统时间序列数据,我试图找到超出特定阈值的连续数据点。

我目前正在逐行手动使用 excel 公式来执行此操作,但是当我尝试搜索更有效的方法时,我意识到这可以在 python [=25] 中完成=] groupby 函数.

但是,就我阅读的示例而言,groupby 函数仅对具有相同标签的行进行分组。我想做的是将某个函数传递给 groupby,它可以检查值是否 => 3,然后对这些值进行分组,按其违反阈值的开始和结束时间索引 => 3.

输入:

+-------+---------+------+
| Index |  Time   | Value|
+-------+---------+------+
|     0 | 00:00:01|   3  |
|     1 | 00:00:02|   4  |
|     2 | 00:00:03|   5  |
|     3 | 00:00:04|   2  |
|     4 | 00:00:05|   6  |
|     5 | 00:00:06|   7  |
|     6 | 00:00:07|   1  |
|     7 | 00:00:08|   9  |
+-------+---------+------+

输出:

+-------+-----------+----------+--------+
| Index | TimeStart | TimeEnd  | Value  |
+-------+-----------+----------+--------+
|     0 | 00:00:01  | 00:00:03 |  3,4,5 |
|     1 | 00:00:05  | 00:00:06 |  6,7   |
|     2 | 00:00:08  | 00:00:08 |  9     |
+-------+-----------+----------+--------+
  • 创建小于 3
  • 的遮罩
  • 创建组的累计总和大于或等于3
  • 通过掩码过滤 df,然后 groupby
  • 使用agg一次传递多个函数
  • 重命名列

mask = df.Value.lt(3)
grp = mask.cumsum()

d1 = df[~mask].groupby(grp[~mask]).agg(dict(
    Time=['first', 'last'],
    Value=lambda x: ','.join(map(str, x))
))

d1.columns = ['TimeStart', 'TimeEnd', 'Value']

d1

      TimeStart   TimeEnd  Value
Value                           
0      00:00:01  00:00:03  3,4,5
1      00:00:05  00:00:06    6,7
2      00:00:08  00:00:08      9