确定后续行之间的到期日期数量

时间:2017-11-23 10:22:43

标签: python pandas dataframe

我有一个按ID和分类交易日期分组的表格,如下所示。

id     transactions_date    membership_expire_date
1      2016-11-16           2016-12-16
1      2016-12-15           2017-01-14
1      2017-01-15           2017-02-14
1      2017-02-15           2017-03-17
2      2015-01-31           2015-03-03
2      2015-02-28           2015-03-31
2      2015-04-05           2015-05-01

我想计算用户是否在截止日期迟到。例如,在用户ID 1上,在第二行的transactions_date上,用户在第一行(在membership_expire_date被认为是准时的内部,等于或1天)之前的membership_expire_date之前执行了付款,因此到期金额= 0但是,对于最后一行的用户ID 2,用户在2015-04-05付款。因此,2015-04-05 - 2015-03-31 - 1天(membership_expire_date罚款后一天)= 4天到期。

我该如何计算它们?我用这种方式对它进行分类后陷入困境。

transactions_train = transactions_train.sort_values(by=['id','transaction_date', 'membership_expire_date'], ascending=True)

预期结果如下所示。

id     transactions_date    membership_expire_date     late_count
1      2016-11-16           2016-12-16                     0
1      2016-12-15           2017-01-14                     0
1      2017-01-15           2017-02-14                     0
1      2017-02-16           2017-03-17                     1
2      2015-01-31           2015-03-03                     0
2      2015-02-28           2015-03-31                     0
2      2015-04-05           2015-05-01                     4

1 个答案:

答案 0 :(得分:0)

你确实需要考虑转变。

def days_due(group):
    print('-', group)
    day = pd.Timedelta('1d')
    days_late = ((group['transactions_date'] - group['membership_expire_date'].shift()) / day - 1)
    days_late = days_late.where(days_late > 0)
    return days_late.fillna(0).astype(int)

df['late_count'] = pd.concat(days_due(group) for idx, group in df.groupby('id'))
  id  transactions_date   membership_expire_date  late_count
0     1   2016-11-16  2016-12-16  0
1     1   2016-12-15  2017-01-14  0
2     1   2017-01-15  2017-02-14  0
3     1   2017-02-16  2017-03-17  1
4     2   2015-01-31  2015-03-03  0
5     2   2015-02-28  2015-03-31  0
6     2   2015-04-05  2015-05-01  4
相关问题