在Pandas中,通过添加分钟到日期时间列来创建一个新列,并通过按行号分组来创建另一列



我有一个数据帧,如下所示

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.cumcountto_timedelta转换为时间增量,20 Minutes使用多个20

然后通过GroupBy.transformGroupBy.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

最新更新