根据功能结果,pandas groupby timeseries数据

时间:2017-10-29 00:46:56

标签: python pandas pandas-groupby

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

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

但是,就我已阅读的示例而言,groupby函数仅在行具有相同标签时才对其进行分组。我想要做的是将某个函数传递给groupby,它可以检查value => 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     |
+-------+-----------+----------+--------+

1 个答案:

答案 0 :(得分:3)

  • 创建小于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