2017-04-25 50 views
6

使用Python 3.6和Pandas 0.19.2:python pandas:在一個羣組中的2個日期之間的差異

我有一個DataFrame包含事務處理的解析日誌文件。每行都有時間戳,包含一個transactionid,並且可以表示事務的開始或結束(所以每個transactionid有1行開始和1行結束)。

其他信息也可以出現在每個結束行中。

我想通過用startdate減去結束日期來提取每個事務的持續時間,並保留其他信息。

樣品輸入:

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']) 

其中給出下列數據幀:

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 

預期輸出:

一個新數據幀,例如:

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 

我曾嘗試:

由於2 consecutives線並不總是與同一個交易,我申請.groupby(by='transactionid')我的數據幀。我現在試圖根據我的需要「拼合」每個組。

回答

5

試試這個:

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() 

結果:

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

良好的天哪,MaxU。西部最快的手指。 –

+0

@ScottBoston,謝謝! :) – MaxU

+0

Stackoverflow的人永遠不會驚訝我! :)謝謝,那正是我正在尋找的! – Guillaume