2017-10-10 4 views
0

私はStartEnddatatimeと各イベントのイベントを含むdataframeを持っています。datetimeの違いに基づいてデータフレーム内のグループ行をマージする方法は?

import pandas as pd 
import datetime 
df = pd.DataFrame({ 'Value' : [1.,2.,3.], 
'Start' : [datetime.datetime(2017,1,1,0,0,0),datetime.datetime(2017,1,1,0,1,0),datetime.datetime(2017,1,1,0,4,0)], 
'End' : [datetime.datetime(2017,1,1,0,0,59),datetime.datetime(2017,1,1,0,5,0),datetime.datetime(2017,1,1,0,6,00)]}, 
index=[0,1,2]) 

df 
Out[7]: 
        End    Start Value 
0 2017-01-01 00:00:59 2017-01-01 00:00:00 1.0 
1 2017-01-01 00:05:00 2017-01-01 00:01:00 2.0 
2 2017-01-01 00:07:00 2017-01-01 00:06:00 3.0 

私は連続した行のEndStartとの違いは、与えられたtimedeltaよりも小さいグループの連続した行にしたいと思います。例: ここで私は、しかし、5秒のはtimedeltaためIインデックス0,1とグループ行したいと2分のはtimedeltaとその溶液は.shift()を使用してシフトされたバージョンとの連続した行を比較することであろう0,1,2

列に生じるはずです2つ以上の行のグループをマージする必要がある場合、比較を複数回反復する必要があります。

私のdfが非常に大きいので、これはオプションではありません。

+3

たぶん、そのちょうど私が、私はあなたが –

+3

探しているものを出力見当がつかないあなたの期待を出す./_ \示しました。 – Wen

+0

申し訳ありませんが、それは遅れています:(私は望ましい出力を追加しています – ErroriSalvo

答えて

1
threshold = datetime.timedelta(minutes=5)             
df['delta'] = df['End'] - df['Start']              
df['group'] = (df['delta'] - df['delta'].shift(-1) <= threshold).cumsum()     
groups = df.groupby('group')                
1

時間差に基づいて集計しようとします。

marker = 60 
df = df.assign(diff=df.apply(lambda row:(row.End - row.Start).total_seconds() <= marker, axis=1)) 

for g in df.groupby('diff'): 
    print g[1] 


        End    Start Value diff 
1 2017-01-01 00:05:00 2017-01-01 00:01:00 2.0 False 
2 2017-01-01 00:06:00 2017-01-01 00:04:00 3.0 False 
        End  Start Value diff 
0 2017-01-01 00:00:59 2017-01-01 1.0 True 
関連する問題