python pandas:groupby中2个日期之间的差异

Posted

技术标签:

【中文标题】python pandas:groupby中2个日期之间的差异【英文标题】:python pandas: diff between 2 dates in a groupby 【发布时间】:2017-09-22 12:04:09 【问题描述】:

使用 Python 3.6 和 Pandas 0.19.2:

我有一个 DataFrame,其中包含已解析的事务日志文件。每行都带有时间戳,包含一个事务 ID,并且可以表示事务的开始或结束(因此每个事务 ID 有 1 行表示开始,1 行表示结束)。

附加信息也可以出现在每一端行中。

我想通过 startdate 减去 end date 来提取每笔交易的持续时间,并保留其他信息。

示例输入:

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

它给出了以下 DataFrame:

   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 个连续的行并不总是与同一事务相关,因此我将 .groupby(by='transactionid') 应用于我的数据框。我现在被困在试图根据我的需要“扁平化”每个组。

【问题讨论】:

【参考方案1】:

试试这个:

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

【讨论】:

以上是关于python pandas:groupby中2个日期之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

python pandas groupby分组后的数据怎么用

在python pandas中groupby之后从列中填充缺失的行

Python pandas:替换 groupby 对象中的选择值

使用 pandas 在数据帧上执行 groupby,按计数排序并获取 python 中的前 2 个计数

python pandas groupby() 结果

如何对不同长度的 Python Pandas groupby 对象进行切片?