根据通用ID计算日期差异

时间:2014-07-31 18:21:42

标签: python pandas

我有一个大表,如下所示:

+---+---------+----------+-------+---------+------------+
|   | cust_id | order_id | quant | revenue |    date    |
+---+---------+----------+-------+---------+------------+
| 0 |  103502 |   107801 |     1 | 246.5   | 2014-07-15 |
| 1 |  110301 |   108001 |     2 | 106.0   | 2014-07-15 |
| 2 |  110301 |   108101 |     2 | 106.0   | 2014-07-15 |
| 3 |  111401 |   108201 |     2 | 408.5   | 2014-07-15 |
| 4 |  111502 |   108301 |     1 | 196.0   | 2014-07-15 |
+---+---------+----------+-------+---------+------------+

对于购买多次(相同cust_id)的客户,我正在尝试将数据分组在一起,以找到每个数据的最早和最晚日期。例如,在2014-6-30和2013-6-30购买cust_id 123456。对于我的场景,我希望365天的输出。

这是我会使用groupby然后应用函数吗?我尝试为cust_id和date列做一个groupby,但我得到了一个对象,所以我不确定它是否格式正确。

2 个答案:

答案 0 :(得分:2)

好的,让我们从groupby开始做什么。

(我更改了您的数据,以便为您提供不同的日期,因为如果它们完全相同,则不是很有趣。)

>>> d={'cust_id': (103502,110301,110301,111401,111502),
...    'order_id': (107801,108001,108101,108201,108301), 
...    'quant': (1,2,2,2,1), 
...    'revenue': (246.5,106.0,106.0,408.5,196.0), 
...    'date': [datetime.datetime.strptime(dt, '%Y-%m-%d') for dt in 
...             ('2014-07-15', '2014-07-16', '2014-07-17', '2014-07-18', '2014-07-19')]}
>>> df = pd.DataFrame(d)
>>> df
   cust_id       date  order_id  quant  revenue
0   103502 2014-07-15    107801      1    246.5
1   110301 2014-07-16    108001      2    106.0
2   110301 2014-07-17    108101      2    106.0
3   111401 2014-07-18    108201      2    408.5
4   111502 2014-07-19    108301      1    196.0
>>> gb = df.groupby('cust_id')
>>> gb.groups
{111401: [3], 111502: [4], 110301: [1, 2], 103502: [0]}

这很清楚:每个cust_id都有一组关联的行。

那么,我们能做些什么呢?好吧,就像您可以访问DataFrame的列来获取Series一样,您可以访问DataFrameGroupBy的列来获取SeriesGroupBy。然后在这些列上调用聚合方法,这为每个组提供一个值:

>>> gb['date'].max()
cust_id
103502     2014-07-15
110301     2014-07-17
111401     2014-07-18
111502     2014-07-19
Name: date, dtype: datetime64[ns]

那么,(我认为)你想要的是:

>>> gb['date'].max() - gb['date'].min()
cust_id
103502    0 days
110301    1 days
111401    0 days
111502    0 days
Name: date, dtype: timedelta64[ns]

答案 1 :(得分:0)

如果从数据库表中获取这些数据,并且该表名称为t1,则以下查询将给出日期差异。

select t1.cust_id,max(t2.date)-min(t1.date) from t1, t1 as t2 where t1.cust_id=t2.cust_id group by t1.cust_id;