使用数据帧中的某些参数计算日期之间的差异
Calculating the difference between dates with certain parameters from data Frame
我有兴趣计算来自同一提供商的订单之间的时间差(以天为单位)
源数据框:
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
您必须先将 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
是为了保证return正值。
正如@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'))
答案是
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
我有兴趣计算来自同一提供商的订单之间的时间差(以天为单位)
源数据框:
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
您必须先将 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
是为了保证return正值。
正如@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'))
答案是
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