Создайте новый столбец, если частота времени превышает определенное значение

#pandas #dataframe #datetime

Вопрос:

У меня есть фрейм данных, который увеличивается с частотой 15 минут, но иногда имеет пробел, который я хочу сгруппировать по задаче.

Вот пример данных:

 Input:

data = {'Date':['2019-01-05 00:00:00', '2019-01-05 00:15:00',
                '2019-01-05 00:30:00', '2019-01-05 00:45:00',
                '2019-01-05 01:00:00', '2019-01-05 01:15:00',
                '2019-01-05 01:30:00', '2019-01-05 01:45:00',
               '2019-01-06 15:00:00', '2019-01-06 15:15:00',
               '2020-01-06 15:30:00', '2020-01-06 15:45:00',
               '2020-02-10 22:15:00', '2020-02-10 22:30:00',
               '2020-02-10 22:45:00', '2020-02-10 23:00:00',
                '2020-02-11 23:15:00', '2020-02-11 23:30:00',
                '2020-02-11 23:45:00', '2020-02-11 00:00:00'],
        'Ratings':[9.0, 8.0, 5.0, 3.0, 5.0,
                  1.0, 5.2, 4.5, 8.9, 4.5,
                  4.5, 7.6, 8.3, 5.6, 5.3,
                  3.4, 5.5, 2.4, 5.3, 5.4]}  
  
df = pd.DataFrame(data, index =[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])  
  
# print the data  
print(df)

Output:
                   Date  Ratings
1   2019-01-05 00:00:00      9.0
2   2019-01-05 00:15:00      8.0
3   2019-01-05 00:30:00      5.0
4   2019-01-05 00:45:00      3.0
5   2019-01-05 01:00:00      5.0
6   2019-01-05 01:15:00      1.0
7   2019-01-05 01:30:00      5.2
8   2019-01-05 01:45:00      4.5
9   2019-01-06 15:00:00      8.9
10  2019-01-06 15:15:00      4.5
11  2020-01-06 15:30:00      4.5
12  2020-01-06 15:45:00      7.6
13  2020-02-10 22:15:00      8.3
14  2020-02-10 22:30:00      5.6
15  2020-02-10 22:45:00      5.3
16  2020-02-10 23:00:00      3.4
17  2020-02-11 23:15:00      5.5
18  2020-02-11 23:30:00      2.4
19  2020-02-11 23:45:00      5.3
20  2020-02-11 00:00:00      5.4
 

Где мне нужно его отсортировать, создав новый столбец, если частота превышает то, что должно быть, что в данном случае составляет 15 минут.

Желанный:

                    Date  Ratings  Task
1   2019-01-05 00:00:00      9.0     1
2   2019-01-05 00:15:00      8.0     1
3   2019-01-05 00:30:00      5.0     1
4   2019-01-05 00:45:00      3.0     1
5   2019-01-05 01:00:00      5.0     1
6   2019-01-05 01:15:00      1.0     1
7   2019-01-05 01:30:00      5.2     1
8   2019-01-05 01:45:00      4.5     1
9   2019-01-06 15:00:00      8.9     2
10  2019-01-06 15:15:00      4.5     2
11  2019-01-06 15:30:00      4.5     2
12  2019-01-06 15:45:00      7.6     2
13  2019-02-10 22:15:00      8.3     3
14  2019-02-10 22:30:00      5.6     3
15  2019-02-10 22:45:00      5.3     3
16  2019-02-10 23:00:00      3.4     3
17  2019-02-11 00:00:00      5.5     4
18  2019-02-11 00:15:00      2.4     4
19  2019-02-11 00:30:00      5.3     4
20  2019-02-11 00:45:00      5.4     4
 

Как вы можете видеть, есть 4 задачи, сгруппированные вместе, если есть скачок во времени >15 минут.

В настоящее время столбец даты находится в формате datetime64, и я могу установить его в любой требуемый формат. Спасибо!

Комментарии:

1. Ваш входной и выходной фрейм данных не совпадают, проверьте столбец даты.

Ответ №1:

Попробуй:

 df['Task'] = df['Date'].sub(df['Date'].shift()) 
                       .gt(pd.Timedelta(minutes=15)) 
                       .cumsum()   1
 
 >>> df
                  Date  Ratings  Task
1  2019-01-05 00:00:00      9.0     1
2  2019-01-05 00:15:00      8.0     1
3  2019-01-05 00:30:00      5.0     1
4  2019-01-05 00:45:00      3.0     1
5  2019-01-05 01:00:00      5.0     1
6  2019-01-05 01:15:00      1.0     1
7  2019-01-05 01:30:00      5.2     1
8  2019-01-05 01:45:00      4.5     1
9  2019-01-06 15:00:00      8.9     2
10 2019-01-06 15:15:00      4.5     2
11 2020-01-06 15:30:00      4.5     3
12 2020-01-06 15:45:00      7.6     3
13 2020-02-10 22:15:00      8.3     4
14 2020-02-10 22:30:00      5.6     4
15 2020-02-10 22:45:00      5.3     4
16 2020-02-10 23:00:00      3.4     4
17 2020-02-11 23:15:00      5.5     5
18 2020-02-11 23:30:00      2.4     5
19 2020-02-11 23:45:00      5.3     5
20 2020-02-11 00:00:00      5.4     5