Python 计算自日期列起的天数

Python 计算自日期列起的天数,python,python-3.x,pandas,Python,Python 3.x,Pandas,我想计算每个客户在订阅之前最后一次交易的天数。 如果每个客户的订阅日期相同,那么我可以过滤掉订阅日期之后的trx日期,但是客户有不同的订阅日期 初始数据帧 ad = {'customer':['Clark','Stones','Fay','Stones','Clark','Clark','Clark'], 'subscribe_date':['2020-11-30','2020-07-01','2021-01-02','2020-07-12','2020-11-30','2020-11-

我想计算每个客户在订阅之前最后一次交易的天数。 如果每个客户的订阅日期相同,那么我可以过滤掉订阅日期之后的trx日期,但是客户有不同的订阅日期

初始数据帧

ad = {'customer':['Clark','Stones','Fay','Stones','Clark','Clark','Clark'],
    'subscribe_date':['2020-11-30','2020-07-01','2021-01-02','2020-07-12','2020-11-30','2020-11-30','2020-11-30'],
    'trx_date':['2020-12-30','2020-07-12','2020-07-14','2020-07-25','2021-02-01','2020-09-01','2020-11-27'],
    'trx_amount':[100,90,50,45,20,30,50],
    }
ad = pd.DataFrame(ad)
ad.sort_values(by=['customer','trx_date'])
ad2 = {'customer':['Clark','Stones','Fay'],
    'subscribe_date':['2020-11-30','2020-07-01','2021-01-02'],
      'days_since_last_succ_tx_BEFORE_subs':['3','0','0']}
ad2 = pd.DataFrame(ad2)
ad2
预期数据帧

ad = {'customer':['Clark','Stones','Fay','Stones','Clark','Clark','Clark'],
    'subscribe_date':['2020-11-30','2020-07-01','2021-01-02','2020-07-12','2020-11-30','2020-11-30','2020-11-30'],
    'trx_date':['2020-12-30','2020-07-12','2020-07-14','2020-07-25','2021-02-01','2020-09-01','2020-11-27'],
    'trx_amount':[100,90,50,45,20,30,50],
    }
ad = pd.DataFrame(ad)
ad.sort_values(by=['customer','trx_date'])
ad2 = {'customer':['Clark','Stones','Fay'],
    'subscribe_date':['2020-11-30','2020-07-01','2021-01-02'],
      'days_since_last_succ_tx_BEFORE_subs':['3','0','0']}
ad2 = pd.DataFrame(ad2)
ad2
说明: 克拉克已经交易了4次。他于2020年11月30日签署。他在认购前的最后一天是2020年11月27日。因此,该值为3

如果客户在订阅之前从未进行过交易,我将保留np.NaN值。

使用:

#convert to datetimes
ad['trx_date'] = pd.to_datetime(ad['trx_date'])
ad['subscribe_date'] = pd.to_datetime(ad['subscribe_date'])

#get days difference
ad['days'] =  ad['subscribe_date'].sub(ad['trx_date']).dt.days

#replace nagative to NaN
ad['days'] = ad['days'].mask(ad['days'].lt(0))

#get rows by minimal days per customer
cols = ['customer','subscribe_date','days']
df = ad.sort_values(['customer','days']).drop_duplicates('customer')[cols]
print (df)
  customer subscribe_date   days
6    Clark     2020-11-30    3.0
2      Fay     2021-01-02  172.0
1   Stones     2020-07-01    NaN
使用:


我相信对方回答得更快。谢谢你的时间和努力@Luc另一个人在2分钟后被贴了出来。我相信另一个人回答得更快。谢谢你的时间和努力@2分钟后,Luc又发了一封邮件。