我有一个按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
答案 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