我正在尝试计算不在同一列中的不同行中的日期之间的差异。我有以下数据集:
售货亭 | 在线 | 离线 | 在线日 |
---|---|---|---|
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 的上一行中的离线日期之间的差异。
这是我在输出数据框中需要的输出:
售货亭 | 在线 | 离线 | 在线日 | 离线天数 |
---|---|---|---|---|
1 | 12/1/2022 | 12/5/2022 | 4 | 楠 |
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 | 楠 |
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 | 楠 |
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 |
我考虑到了 Mozway 的评论,所以我建议您改用以下代码(我没有看到您想要通过 kiosk 获得它):
df['Online'] = pd.to_datetime(df['Online'], infer_datetime_format=True)
df['Offline'] = pd.to_datetime(df['Offline'], infer_datetime_format=True)
df['Offsets'] = (df['Online'] - df.groupby('Kiosk')['Offline'].shift(1)).dt.days
print(df)
结果
Kiosk Online Offline Online Days Offsets
0 1 2022-12-01 2022-12-05 4 NaT
1 1 2022-12-07 2022-12-17 10 2 days
2 1 2022-12-20 2022-12-21 1 3 days
3 1 2022-12-24 2022-12-29 5 3 days
4 2 2022-11-15 2022-11-30 15 NaT
5 2 2022-12-02 2022-12-07 5 2 days
6 2 2022-12-15 2022-12-25 10 8 days
7 3 2022-10-30 2022-11-15 16 NaT
8 3 2022-11-17 2022-11-22 5 2 days
9 3 2022-11-23 2022-11-30 7 1 days
10 3 2022-12-04 2022-12-15 11 4 days
11 3 2022-12-18 2022-12-20 2 3 days
.shift
对齐Offline
日期并从Online
日期中减去,然后使用.where
在Kiosk
变化时清空[或消除负面差异]。
# df = pd.read_html('https://stackoverflow.com/questions/75962581')[0]
# df[['Online','Offline']] = df[['Online','Offline']].applymap(pd.to_datetime)
offline_days = df['Online'] - df['Offline'].shift(1)
df['Offline Days'] = offline_days.where(df['Kiosk']==df['Kiosk'].shift(1))
# df['Offline Days'] = offline_days.where(lambda td: td>pd.Timedelta(0))