使用数据帧中的某些参数计算日期之间的差异

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

OrderNumberCatID没意思。

我想计算同一 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