создать новые столбцы, добавив столбец минут к дате и другой столбец по номеру строки группы в Pandas - PullRequest
1 голос
/ 27 апреля 2020

У меня есть фрейм данных, как показано ниже

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_appt_time совпадает с appt_time. затем добавляем к этому 20 минут, где, как и в appt_time, некоторые appt_time повторяются.

slot_num просто подсчитывает временной интервал этого сеанса на основе времени назначения.

1 Ответ

1 голос
/ 27 апреля 2020

Используйте GroupBy.cumcount для счетчика Series, преобразованного в timedeltas на to_timedelta и кратного 20 для 20 Minutes.

Затем получите первая временная метка на группу: GroupBy.transform и GroupBy.first, добавьте timedeltas и, наконец, для столбца счетчика добавьте 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
...