2017-04-25 43 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