2017-10-29 178 views
2

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

我目前正在使用excel公式手动执行此操作,但由于我试图搜索更高效的方法,我意识到这可以在python熊猫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  | 
+-------+-----------+----------+--------+ 

回答

2
  • 创建的掩模,其中小于3
  • 累积总和至CRE吃基团,其中大于或等于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 
+0

爵士此超级,我希望它获得更多的选票。 – Dark

+0

非常感谢你!我不知道你使用的功能,如cumsum和mask,这是我目前在python中的知识。将深入挖掘这些。再次感谢你。 –

相关问题