2017-04-25 5 views
6

Verwendung von Python 3.6 und Pandas 0.19.2:Python Pandas: diff zwischen 2 Termine in einem groupby

Ich habe einen Datenrahmen analysiert Protokolldateien für Transaktionen enthalten. Jede Zeile ist mit einem Zeitstempel versehen, enthält eine Transaktions-ID und kann entweder den Anfang oder das Ende einer Transaktion darstellen (also hat jede Transaktions-ID 1 Zeile für Start und 1 Zeile für Ende).

Zusätzliche Informationen können auch in jeder Endzeile vorhanden sein.

Ich möchte die Dauer jeder Transaktion durch Subtrahieren Enddatum mit Startdatum extrahieren, und behalten Sie die zusätzlichen Infos.

Probeneingang:

import pandas as pd 
import io 
df = pd.read_csv(io.StringIO('''transactionid;event;datetime;info 
1;START;2017-04-01 00:00:00; 
1;END;2017-04-01 00:00:02;foo1 
2;START;2017-04-01 00:00:02; 
3;START;2017-04-01 00:00:02; 
2;END;2017-04-01 00:00:03;foo2 
4;START;2017-04-01 00:00:03; 
3;END;2017-04-01 00:00:03;foo3 
4;END;2017-04-01 00:00:04;foo4'''), sep=';', parse_dates=['datetime']) 

, die die folgenden Datenrahmen gibt:

transactionid event    datetime info 
0    1 START 2017-04-01 00:00:00 NaN 
1    1 END 2017-04-01 00:00:02 foo1 
2    2 START 2017-04-01 00:00:02 NaN 
3    3 START 2017-04-01 00:00:02 NaN 
4    2 END 2017-04-01 00:00:03 foo2 
5    4 START 2017-04-01 00:00:03 NaN 
6    3 END 2017-04-01 00:00:03 foo3 
7    4 END 2017-04-01 00:00:04 foo4 

Erwartete Ausgabe:

Ein neuer Datenrahmen wie:

transactionid   start_date    end_date duration info 
0    1 2017-04-01 00:00:00 2017-04-01 00:00:02 00:00:02 foo1 
1    2 2017-04-01 00:00:02 2017-04-01 00:00:03 00:00:01 foo2 
2    3 2017-04-01 00:00:02 2017-04-01 00:00:03 00:00:01 foo3 
3    4 2017-04-01 00:00:03 2017-04-01 00:00:04 00:00:01 foo4 

Was ich versucht habe:

Seit 2 consecutives Linien sind nicht immer im Zusammenhang mit der gleichen Transaktion, bewerben ich mich ein .groupby(by='transactionid') meinen Datenrahmen. Ich stehe nun fest und versuche jede Gruppe nach meinen Bedürfnissen zu "glätten".

Antwort

5

versuchen Sie dies:

df.datetime = pd.to_datetime(df.datetime) 

funcs = { 
    'datetime':{ 
     'start_date': 'min', 
     'end_date':  'max', 
     'duration':  lambda x: x.max() - x.min(), 
    }, 
    'info':    'last' 
} 

df.groupby(by='transactionid')['datetime','info'].agg(funcs).reset_index() 

Ergebnis:

In [103]: df.groupby(by='transactionid')['datetime','info'].agg(funcs).reset_index() 
Out[103]: 
    transactionid   start_date   end_date duration last 
0    1 2017-04-01 00:00:00 2017-04-01 00:00:02 00:00:02 foo1 
1    2 2017-04-01 00:00:02 2017-04-01 00:00:03 00:00:01 foo2 
2    3 2017-04-01 00:00:02 2017-04-01 00:00:03 00:00:01 foo3 
3    4 2017-04-01 00:00:03 2017-04-01 00:00:04 00:00:01 foo4 
+0

Good Golly, MAXU. Schnellste Finger im Westen. –

+0

@ScottBoston, danke! :) – MaxU

+0

Stackoverflow Leute hören nie auf, mich zu überraschen! :) Danke, genau das suche ich! – Guillaume