我有一个数据帧,如下所示
session appt_time
s1 2020-01-06 09:00:00
s1 2020-01-06 09:20:00
s1 2020-01-06 09:40:00
s1 2020-01-06 09:40:00
s1 2020-01-06 10:00:00
s1 2020-01-06 10:00:00
s2 2020-01-06 08:20:00
s2 2020-01-06 08:40:00
s2 2020-01-06 08:40:00
s2 2020-01-06 09:00:00
s2 2020-01-06 09:20:00
s2 2020-01-06 09:40:00
s2 2020-01-06 09:40:00
s2 2020-01-06 10:00:00
s3 2020-01-09 13:00:00
s3 2020-01-09 13:00:00
s3 2020-01-09 13:20:00
s3 2020-01-09 13:40:00
根据上面的内容,我想创建一个名为ideal_appt_time和slot_num的新列,如下所示。
session appt_time ideal_appt_time slot_num
s1 2020-01-06 09:00:00 2020-01-06 09:00:00 1
s1 2020-01-06 09:20:00 2020-01-06 09:20:00 2
s1 2020-01-06 09:40:00 2020-01-06 09:40:00 3
s1 2020-01-06 09:40:00 2020-01-06 10:00:00 4
s1 2020-01-06 10:00:00 2020-01-06 10:20:00 5
s1 2020-01-06 10:00:00 2020-01-06 10:40:00 6
s2 2020-01-06 08:20:00 2020-01-06 08:20:00 1
s2 2020-01-06 08:40:00 2020-01-06 08:40:00 2
s2 2020-01-06 08:40:00 2020-01-06 09:00:00 3
s2 2020-01-06 09:00:00 2020-01-06 09:20:00 4
s2 2020-01-06 09:20:00 2020-01-06 09:40:00 5
s2 2020-01-06 09:40:00 2020-01-06 10:00:00 6
s2 2020-01-06 09:40:00 2020-01-06 10:20:00 7
s2 2020-01-06 10:00:00 2020-01-06 10:40:00 8
s3 2020-01-09 13:00:00 2020-01-09 13:00:00 1
s3 2020-01-09 13:00:00 2020-01-09 13:20:00 2
s3 2020-01-09 13:20:00 2020-01-09 13:40:00 3
s3 2020-01-09 13:40:00 2020-01-09 14:00:00 4
说明:
其中ideal_appt_time是基于appt_time计算的,ideal_apt_time的开始与appt_time相同。然后再加上20分钟,就像在appt_time中一样,一些appt_time正在重复。
slot_num只是根据分配时间计算了该会话的时隙。
计数器Series
使用GroupBy.cumcount
,to_timedelta
转换为时间增量,20 Minutes
使用多个20
。
然后通过GroupBy.transform
和GroupBy.first
获得每组的第一个时间戳,添加时间增量,最后一个计数器列添加1
:
df['appt_time'] = pd.to_datetime(df['appt_time'])
counts = df.groupby('session').cumcount()
td = pd.to_timedelta(counts, unit='Min') * 20
df['ideal_appt_time'] = df.groupby('session')['appt_time'].transform('first') + td
df['slot_num'] = counts + 1
print (df)
session appt_time ideal_appt_time slot_num
0 s1 2020-01-06 09:00:00 2020-01-06 09:00:00 1
1 s1 2020-01-06 09:20:00 2020-01-06 09:20:00 2
2 s1 2020-01-06 09:40:00 2020-01-06 09:40:00 3
3 s1 2020-01-06 09:40:00 2020-01-06 10:00:00 4
4 s1 2020-01-06 10:00:00 2020-01-06 10:20:00 5
5 s1 2020-01-06 10:00:00 2020-01-06 10:40:00 6
6 s2 2020-01-06 08:20:00 2020-01-06 08:20:00 1
7 s2 2020-01-06 08:40:00 2020-01-06 08:40:00 2
8 s2 2020-01-06 08:40:00 2020-01-06 09:00:00 3
9 s2 2020-01-06 09:00:00 2020-01-06 09:20:00 4
10 s2 2020-01-06 09:20:00 2020-01-06 09:40:00 5
11 s2 2020-01-06 09:40:00 2020-01-06 10:00:00 6
12 s2 2020-01-06 09:40:00 2020-01-06 10:20:00 7
13 s2 2020-01-06 10:00:00 2020-01-06 10:40:00 8
14 s3 2020-01-09 13:00:00 2020-01-09 13:00:00 1
15 s3 2020-01-09 13:00:00 2020-01-09 13:20:00 2
16 s3 2020-01-09 13:20:00 2020-01-09 13:40:00 3
17 s3 2020-01-09 13:40:00 2020-01-09 14:00:00 4