用Python计算当前行日期与上一行上一列日期的差值

问题描述 投票:0回答:2

我正在尝试计算不在同一列中的不同行中的日期之间的差异。我有以下数据集:

售货亭 在线 离线 在线日
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
python pandas diff calculation
2个回答
1
投票

我考虑到了 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

0
投票

使用

.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))

© www.soinside.com 2019 - 2024. All rights reserved.