Groupby - генерирует дату и время как последовательность - PullRequest
0 голосов
/ 23 апреля 2020

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

session      slot_num
s1           1
s1           2
s1           3
s1           3
s1           4
s1           4
s2           1
s2           2
s2           2
s2           3
s2           4
s2           5
s2           5
s2           6
s3           1
s3           1
s3           2
s3           3

из вышеперечисленного, я хотел бы создать столбец appt_time, как показано ниже.

Ожидаемый вывод

session      slot_num     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           3            2020-01-06 09:40:00
s1           4            2020-01-06 10:00:00
s1           4            2020-01-06 10:00:00
s2           1            2020-01-06 08:20:00
s2           2            2020-01-06 08:40:00
s2           2            2020-01-06 08:40:00
s2           3            2020-01-06 09:00:00
s2           4            2020-01-06 09:20:00
s2           5            2020-01-06 09:40:00
s2           5            2020-01-06 09:40:00
s2           6            2020-01-06 10:00:00
s3           1            2020-01-09 13:00:00
s3           1            2020-01-09 13:00:00
s3           2            2020-01-09 13:20:00
s3           3            2020-01-09 13:40:00

Объяснение: для сеанса = s1, время appt_start = 2020-01-06 09:00:00, затем для каждого увеличения slot_num для этого увеличения сеанса appt_time на 20 минут.

для сеанса = s2, время appt_start = 2020-01-06 08:20:00, затем для каждого увеличения slot_num для этого сеанса увеличивается appt_time на 20 минут.

для сеанса = s3, время appt_start = 2020-01-09 13:00: 00, затем для каждого увеличения slot_num для этого увеличения сеанса appt_time на 20 минут.

1 Ответ

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

Сначала необходимо указать указанные первые даты и время для каждого session, здесь используется словарь с Series.map, преобразовать в даты и время, а затем добавить timedeltas на 20 минут на to_timedelta с вычитанием 0 для добавленного 0 Timedelta для первой группы и кратным для 20 minute s:

d = {'s1':'2020-01-06 09:00:00',
     's2':'2020-01-06 08:20:00',
     's3':'2020-01-09 13:00:00'}

df['appt_time'] =  (pd.to_datetime(df['session'].map(d)) + 
                    pd.to_timedelta(df['slot_num'].sub(1), unit='T').mul(20))
print (df)
   session  slot_num           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         3 2020-01-06 09:40:00
4       s1         4 2020-01-06 10:00:00
5       s1         4 2020-01-06 10:00:00
6       s2         1 2020-01-06 08:20:00
7       s2         2 2020-01-06 08:40:00
8       s2         2 2020-01-06 08:40:00
9       s2         3 2020-01-06 09:00:00
10      s2         4 2020-01-06 09:20:00
11      s2         5 2020-01-06 09:40:00
12      s2         5 2020-01-06 09:40:00
13      s2         6 2020-01-06 10:00:00
14      s3         1 2020-01-09 13:00:00
15      s3         1 2020-01-09 13:00:00
16      s3         2 2020-01-09 13:20:00
17      s3         3 2020-01-09 13:40:00
...