2017-10-29 175 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中的知識。將深入挖掘這些。再次感謝你。 –

相關問題