我有一个如下所示的数据框
Session slot_num
s1 1
s1 2
s1 3
s1 4
s2 1
s2 2
s3 1
s3 2
s3 3
还有一本名为session_start_time的字典
session_start_time = {'s1':'2020-01-06 09:00:00','s2':'2020-08-06 06:00:00','s3':'2020-9-06 19:00:00'}
据此,我想在数据框下方进行准备
预期输出:
Session slot_num ideal_appt_time
s1 1 2020-01-06 09:00:00
s1 2 2020-01-06 09:20:00
s1 3 2020-01-06 09:40:00
s1 4 2020-01-06 10:00:00
s2 1 2020-08-06 06:00:00
s2 2 2020-08-06 06:20:00
s3 1 2020-09-06 19:00:00
s3 2 2020-09-06 19:20:00
s3 3 2020-09-06 19:40:00
说明: 从给定的字典中选择每个会话的开始时间,并保留该会话的第一个时段的时间,然后根据该会话的slot_number添加20分钟。
我尝试了以下代码:
counts = df.groupby('Session').cumcount()
td = pd.to_timedelta(counts, unit='Min') * 20
df['ideal_appt_time'] = session_start_time[df.groupby('Session')] + td
# number the slot for each session
df['slot_num'] = counts + 1
答案 0 :(得分:1)
将Series.map
与to_datetime
一起用于日期时间序列,然后将转换后的列slot_num
添加到to_timedelta
的时间增量中,并减去1
以{{1}开头},然后乘以0
乘以20分钟:
20
如果无法使用列df['ideal_appt_time'] = (pd.to_datetime(df['Session'].map(session_start_time))
.add(pd.to_timedelta(df['slot_num'].sub(1).mul(20), unit='Min')))
print (df)
Session slot_num ideal_appt_time
0 s1 1 2020-01-06 09:00:00
1 s1 2 2020-01-06 09:20:00
2 s1 3 2020-01-06 09:40:00
3 s1 4 2020-01-06 10:00:00
4 s2 1 2020-08-06 06:00:00
5 s2 2 2020-08-06 06:20:00
6 s3 1 2020-09-06 19:00:00
7 s3 2 2020-09-06 19:20:00
8 s3 3 2020-09-06 19:40:00
,请对计数器使用GroupBy.cumcount
作为替代解决方案:
slot_num