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

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

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

【问题讨论】:

你可能想看看 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

【讨论】:

以上是关于使用数据帧中的某些参数计算日期之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

如果差异小于 10 分钟,如何计算日期之间的时间

计算 Hive 数组中连续日期之间的差异

如何为行中的多个集合计算存储过程中两个日期之间的差异

计算数据集不同行中日期之间的日期差异

在R中按组计算日期之间的差异

计算Java中的日期差异