如何用Python计算同Kiosk下当前行与前一行跨列日期差值
计算同Kiosk下跨行列的日期差值
我需要计算不同行且不同列之间的日期差值,现有包含Kiosk、Online、Offline、Online Days字段的数据集:
| Kiosk | Online | Offline | Online Days |
|---|---|---|---|
| 1 | 12/1/2022 | 12/5/2022 | 4 |
| 1 | 12/7/2022 | 12/17/2022 | 10 |
| 1 | 12/20/2022 | 12/21/2022 | 1 |
| 1 | 12/24/2022 | 12/29/2022 | 5 |
| 2 | 11/15/2022 | 11/30/2022 | 15 |
| 2 | 12/2/2022 | 12/7/2022 | 5 |
| 2 | 12/15/2022 | 12/25/2022 | 10 |
| 3 | 10/30/2022 | 11/15/2022 | 16 |
| 3 | 11/17/2022 | 11/22/2022 | 5 |
| 3 | 11/23/2022 | 11/30/2022 | 7 |
| 3 | 12/4/2022 | 12/15/2022 | 11 |
| 3 | 12/18/2022 | 12/20/2022 | 2 |
我知道可以使用diff()函数计算同一列内不同行的差值,但未找到可同时偏移行和列的函数。在本案例中,我需要针对同一Kiosk,计算当前行的Online日期与前一行的Offline日期的差值,将其作为Offline Days字段添加到数据集中。期望输出的数据集如下:
| Kiosk | Online | Offline | Online Days | Offline Days |
|---|---|---|---|---|
| 1 | 12/1/2022 | 12/5/2022 | 4 | NaN |
| 1 | 12/7/2022 | 12/17/2022 | 10 | 2 |
| 1 | 12/20/2022 | 12/21/2022 | 1 | 3 |
| 1 | 12/24/2022 | 12/29/2022 | 5 | 3 |
| 2 | 11/15/2022 | 11/30/2022 | 15 | NaN |
| 2 | 12/2/2022 | 12/7/2022 | 5 | 2 |
| 2 | 12/15/2022 | 12/25/2022 | 10 | 8 |
| 3 | 10/30/2022 | 11/15/2022 | 16 | NaN |
| 3 | 11/17/2022 | 11/22/2022 | 5 | 2 |
| 3 | 11/23/2022 | 11/30/2022 | 7 | 1 |
| 3 | 12/4/2022 | 12/15/2022 | 11 | 4 |
| 3 | 12/18/2022 | 12/20/2022 | 2 | 3 |
初始DataFrame代码如下:
import pandas as pd df = pd.DataFrame({ 'Kiosk': [1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3], 'Online': ["12/1/2022", "12/7/2022","12/20/2022", "12/24/2022","11/15/2022", "12/2/2022","12/15/2022", "10/30/2022","11/17/2022", "11/23/2022", "12/4/2022", "12/18/2022"], 'Offline': ["12/5/2022", "12/17/2022","12/21/2022", "12/29/2022","11/30/2022", "12/7/2022","12/25/2022", "11/15/2022","11/22/2022", "11/30/2022", "12/15/2022", "12/20/2022"], 'Online Days': [4, 10, 1, 5, 15, 5, 10, 16, 5, 7, 11, 2], })
解决方案
- 转换日期列类型:首先将字符串格式的日期转换为
datetime类型,否则无法进行日期差值计算:
df['Online'] = pd.to_datetime(df['Online']) df['Offline'] = pd.to_datetime(df['Offline'])
- 分组偏移并计算差值:按
Kiosk分组,对Offline列执行行偏移(下移一行),再用当前行的Online日期减去偏移后的Offline日期,提取天数作为Offline Days:
# 对每个Kiosk组的Offline列下移一行,对应前一行的Offline值 df['Offline Days'] = df.groupby('Kiosk')['Offline'].shift(1) # 计算日期差并提取天数 df['Offline Days'] = (df['Online'] - df['Offline Days']).dt.days
执行上述代码后,df的结果就与期望输出完全一致,每个Kiosk的第一行因为没有前一行数据,Offline Days会显示为NaN。
内容的提问来源于stack exchange,提问作者the_zeef
相关产品推荐
相关产品推荐

