首页 > 解决方案 > 熊猫:根据日期列创建一个时期

问题描述

我有一个数据框

ID              datetime 
11              01-09-2021 10:00:00
11              01-09-2021 10:15:15
11              01-09-2021 15:00:00
12              01-09-2021 15:10:00
11              01-09-2021 18:00:00

如果它增加到 2 小时,我需要添加仅基于日期时间的时间段

ID              datetime                 period
11              01-09-2021 10:00:00        1
11              01-09-2021 10:15:15        1
11              01-09-2021 15:00:00        2
12              01-09-2021 15:10:00        2
11              01-09-2021 18:00:00        3

同样的事情,但基于 ID 和日期时间

ID              datetime                 period
11              01-09-2021 10:00:00        1
11              01-09-2021 10:15:15        1
11              01-09-2021 15:00:00        2
12              01-09-2021 15:10:00        1
11              01-09-2021 18:00:00        3

我怎样才能做到这一点?

标签: pandasdatetime

解决方案


您可以通过Series.diff、转换为 hours Series.dt.total_seconds、comapre for2并添加累积总和来获得差异:

df['period'] = df['datetime'].diff().dt.total_seconds().div(3600).gt(2).cumsum().add(1)
print (df)
   ID            datetime  period
0  11 2021-01-09 10:00:00       1
1  11 2021-01-09 10:15:15       1
2  11 2021-01-09 15:00:00       2
3  12 2021-01-09 15:10:00       2
4  11 2021-01-09 18:00:00       3

每组类似的想法:

f = lambda x: x.diff().dt.total_seconds().div(3600).gt(2).cumsum().add(1)
df['period'] = df.groupby('ID')['datetime'].transform(f)
print (df)
   ID            datetime  period
0  11 2021-01-09 10:00:00       1
1  11 2021-01-09 10:15:15       1
2  11 2021-01-09 15:00:00       2
3  12 2021-01-09 15:10:00       1
4  11 2021-01-09 18:00:00       3

推荐阅读