2017-08-20 9 views
0

私は、パンダで効率的な次のようなアプローチを提案しています。のは、私はこのようになりますデータフレームを持っているとしましょう:パンダのデータフレームで閾値違反の期間を取得するにはどうすればよいですか?

[TimeStamp]    [Val] 
2017-08-19 22:28:42.000 151 
2017-08-19 22:28:42.001 127 
2017-08-19 22:29:42.000 149 
2017-08-19 22:34:10.000 127 
2017-08-19 22:35:10.000 126 
2017-08-19 22:36:10.000 132 
2017-08-19 22:37:10.000 129 
2017-08-19 22:39:10.000 124 

ヴァルが127を超えたときに、私は時間を得るだろうか?

だから私はの答えを期待したい:データポイント値が127を超えている日付の間にあるどのように多くの :私はまた、これらの日付範囲を見て、などのアクションを実行したいと思います

22:28:42 -> 22:28:42.001 
22:29:42 -> 22:34:10.000 
22:36:10 -> 22:39:10.000 

答えて

1

タイムスタンプ

>> df['TimeStamp'] = pd.to_datetime(df['TimeStamp']) 
>> df = df.sort_values('TimeStamp') 

によってあなたのデータはその後ヴァルは、LTEやGT 127

に変更箇所を見つけるまずソート
>> df['changed'] = (df['Val'] > 127).astype(int).diff().fillna(1).astype(int) 
>> df 
    TimeStamp     Val  changed 
0 2017-08-19 22:28:42.000  151  1 
1 2017-08-19 22:28:42.001  127  -1 
2 2017-08-19 22:29:42.000  149  1 
3 2017-08-19 22:34:10.000  127  -1 
4 2017-08-19 22:35:10.000  126  0 
5 2017-08-19 22:36:10.000  132  1 
6 2017-08-19 22:37:10.000  129  0 
7 2017-08-19 22:39:10.000  124  -1 

上記は、特定のタイムスタンプのために

  • -1は、ヴァルが
  • +1 127はヴァルは127

が最後の時間間隔にあなたを構築GTように変更することを意味し、LTEに変更されていることを意味し必要性

>> pd.DataFrame({ 
>>  't_0': df.loc[df.changed == 1, 'TimeStamp'].reset_index(drop=True), 
>>  't_n': df.loc[df.changed == -1, 'TimeStamp'].reset_index(drop=True)}) 

    t_n       t_0 
0 2017-08-19 22:28:42.001  2017-08-19 22:28:42 
1 2017-08-19 22:34:10.000  2017-08-19 22:29:42 
2 2017-08-19 22:39:10.000  2017-08-19 22:36:10 
+0

新しいデータフレームの構築私にエラーがあります:new_fr = pd.DataFrame({'t_0':fr.loc [fr ['changed'] == 1、 'Time']値、 't_n':fr.loc [fr ['changed '] == -1、' Time ']。values})は次のようになります:ValueError:配列はすべて同じ長さでなければなりません – user7186882

+0

@ user7186882配列の代わりに配列を結果dfに渡して答えを更新してください。 – tarashypka

関連する問題