我有興趣計算來自同一供應商的訂單之間的時間差(以天為單位)
源資料框:
| 訂單號 | 貓ID | 客戶ID | 創建日期 |
|---|---|---|---|
| 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不感興趣。
我想計算同一客戶 ID 中日期之間的差異。
目標日期框架:
| 訂單號 | 貓ID | 客戶ID | 創建日期 | 計算天數 |
|---|---|---|---|---|
| 6543 | 4901 | 1111 | 2008-01-01 | 4天 |
| 6543 | 4901 | 2222 | 2008-01-03 | 7天 |
| 1113 | 4910 | 3333 | 2008-01-03 | 10天 |
| 1234 | 5436 | 1111 | 2008-01-05 | 7天 |
| 1245 | 6434 | 2222 | 2008-01-10 | 5天 |
| 1456 | 2453 | 1111 | 2008-01-12 | 1天 |
| 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
uj5u.com熱心網友回復:
您必須首先將CreateDate列轉換為datetime格式:
df['CreateDate'] = pd.to_datetime(df['CreateDate'])
然后,您可以CustomerID使用以下.loc方法找到相同的位置:
customer_ID = df.loc[df['CustomerID'] == '1111']
最后,您可以計算兩行之間的差異天數:
abs((customer_ID['CreateDate'].loc[0] - customer_ID['CreateDate'][1]).days)
的abs是確保回傳正值。
uj5u.com熱心網友回復:
正如@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'))
uj5u.com熱心網友回復:
答案是
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/383584.html
上一篇:如何使日期成為資料框中的列
