使用数据帧中的某些参数计算日期之间的差异
Posted
技术标签:
【中文标题】使用数据帧中的某些参数计算日期之间的差异【英文标题】:Calculating the difference between dates with certain parameters from data Frame 【发布时间】:2022-01-16 20:58:42 【问题描述】:我有兴趣计算来自同一提供商的订单之间的时间差(以天为单位)
源数据框:
OrderNumber | CatID | CustomerID | CreateDate |
---|---|---|---|
6543 | 4901 | 1111 | 2008-01-01 |
6543 | 4901 | 2222 | 2008-01-03 |
1113 | 4910 | 3333 | 2008-01-03 |
1234 | 5436 | 1111 | 2008-01-05 |
1245 | 6434 | 2222 | 2008-01-10 |
1456 | 2453 | 1111 | 2008-01-12 |
1567 | 64355 | 3333 | 2008-01-13 |
OrderNumber
和 CatID
并不有趣。
我想计算同一 customerID 中日期之间的差异。
目标日期帧:
OrderNumber | CatID | CustomerID | CreateDate | calc days |
---|---|---|---|---|
6543 | 4901 | 1111 | 2008-01-01 | 4 days |
6543 | 4901 | 2222 | 2008-01-03 | 7 days |
1113 | 4910 | 3333 | 2008-01-03 | 10 days |
1234 | 5436 | 1111 | 2008-01-05 | 7 days |
1245 | 6434 | 2222 | 2008-01-10 | 5 days |
1456 | 2453 | 1111 | 2008-01-12 | 1 days |
1567 | 64355 | 3333 | 2008-01-13 | - |
6436 | 64355 | 1111 | 2008-01-13 | - |
1253 | 64355 | 2222 | 2008-01-15 | - |
OrderNumber 和 CatID 不感兴趣
原始数据
OrderNumber CustomerID CreateDate
------------------------------------------
0 27986 712841200 2008-01-01
1 28917 712841200 2008-04-16
2 28451 712630100 2008-02-27
3 29836 712630100 2008-08-21
4 30158 712630100 2008-10-27
... ... ... ...
21621 44318 712841600 2014-12-03
21622 44322 712841600 2014-12-03
21623 42829 712847200 2014-03-05
21624 43547 712847200 2014-06-26
21625 42830 712847200 2014-03-05
【问题讨论】:
你可能想看看 datetime 模块。然后您可以创建日期对象,并可以对日期对象执行算术以检查时差。 【参考方案1】:您必须首先将您的CreateDate
列转换为datetime
格式:
df['CreateDate'] = pd.to_datetime(df['CreateDate'])
然后,你可以使用.loc
方法找到同一个CustomerID
的位置:
customer_ID = df.loc[df['CustomerID'] == '1111']
最后,您可以计算两行之间的天数差:
abs((customer_ID['CreateDate'].loc[0] - customer_ID['CreateDate'][1]).days)
abs
用于确保返回正值。
【讨论】:
我需要为每个客户 ID 都这样做?!【参考方案2】:正如@Mohammadreza Riahi 所说,最好将 CreateDate 列转换为日期时间格式(但保存旧日期):
df['CreateDate_dt'] = pd.to_datetime(df['CreateDate'])
(此时,建议确认日期已正确解析)。
然后我会按客户 ID 和日期订购:
df = df.sort_values([CustomerID,CreateDate_dt])
然后添加此列:
df['date_diff'] = np.where(df['CustomerID']==df['CustomerID'].shift(),
df['CreateDate_dt'] df['CreateDate_dt'].shift(),
np.nan)
这里很酷的是,客户的第一个订单旁边有 NaN,其余所有订单之间的值以天为单位。
如果你想在 INT 工作几天:
df['date_diff_days']=df['date_diff'].astype('timedelta64[D]')
现在你可以这样做:
df.groupby('CustomerID').agg(purchases=('OrderNumber', 'nunique'),
first_purchase=('CreateDate_dt', 'min'),
mean_days_between_purchases=('date_diff_days', 'mean'))
【讨论】:
这里缺少什么 df['CreateDate_dt'] df['CreateDate_dt'].shift(), +,-, , ?【参考方案3】:答案是
data = data.sort_values(by=['CustomerID', 'CreateDate'], ignore_index=True)
data['DaysFromPrevCustOrder'] = np.where(
data['CustomerID'].shift(1) == data['CustomerID'],
(data['CreateDate'] - data['CreateDate'].shift(1)).dt.days,np.nan)
** ## 输出 ## **
CustomerID CreateDate OrderNumber DaysFromPrevCustOrder
0 712013005 2008-02-13 28327 NaN
1 712013005 2008-02-13 28327 0.0
2 712013005 2008-02-13 28327 0.0
3 712013005 2009-03-22 31051 403.0
4 712013005 2009-03-22 31051 0.0
... ... ... ... ...
21621 712970100 2009-06-23 31662 9.0
21622 712970100 2010-04-08 33420 289.0
21623 712970100 2011-01-06 35184 273.0
21624 712970100 2012-05-28 38712 508.0
21625 7122973100 2008-09-28 30020 NaN
【讨论】:
以上是关于使用数据帧中的某些参数计算日期之间的差异的主要内容,如果未能解决你的问题,请参考以下文章