Подсчитывать вхождения в почасовой период времени с заданного времени начала и окончания

У меня есть набор данных, который содержит время начала / окончания встреч в разных комнатах для встреч (экспортировано из календаря комнат для встреч) за период в несколько месяцев. Я хотел бы создать тепловую карту, которая покажет использование в час в среднем за день (скажем, в понедельник). Я сделал макет, чтобы показать, чего я хочу в результате: Требуется макет

Это будет сделано с помощью Plot.ly после этого Руководство по тепловой карте.

Пока что я сделал фреймворк для каждого дня недели и отсортировал его по названию комнаты.

RoomName    Start               End
Room1       18.5.2018 7:00      18.5.2018 19:00
Room1       6.7.2018 7:00        6.7.2018 19:00
Room1       13.7.2018 7:00      13.7.2018 19:00
Room1       20.7.2018 7:00      20.7.2018 19:00
Room1       27.7.2018 7:00      27.7.2018 19:00
Room1       3.8.2018 7:00        3.8.2018 19:00
Room1       29.6.2018 7:00      29.6.2018 19:00
Room1       22.6.2018 7:00      22.6.2018 19:00
Room2       29.6.2018 9:00      29.6.2018 11:00
Room2       15.6.2018 9:00      15.6.2018 10:30
Room2       17.8.2018 10:00     17.8.2018 11:30
...         ...                 ...
Room8       10.8.2018 7:00      10.8.2018 19:00
Room8       17.8.2018 7:00      17.8.2018 19:00

Мне интересно, как обработать эти данные, чтобы создать средние дневные и часовые интервалы в этот день, которые будут содержать количество появлений определенной забронированной комнаты.

Спасибо

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
384
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что ваш фрейм называется df, похоже, вам нужно переиндексировать его, чтобы получить одну строку за 30 минут занятости для каждой комнаты (при условии, что это самый короткий срок бронирования). Сделать это можно так:

for col in ('Start', 'End'):
    df[col] = pd.to_datetime(df[col])

bookings = []
for _, data in df.groupby(['RoomName', 'Start']):
    new_index = pd.DatetimeIndex(
        start=data['Start'].iloc[0], end=data['End'].iloc[0], freq='30Min'
    )

    data = data.set_index('Start').reindex(new_index).ffill()\
               .reset_index(drop=False).rename({'index': 'Time'}, axis='columns')\
               .drop('End', axis='columns')
    bookings.append(data)

occupied_times = pd.concat(bookings, ignore_index=True)

Затем это дает вам из первых нескольких строк вашего фрейма данных:

                   Time RoomName
0   2018-03-08 07:00:00    Room1
1   2018-03-08 07:30:00    Room1
2   2018-03-08 08:00:00    Room1
3   2018-03-08 08:30:00    Room1
4   2018-03-08 09:00:00    Room1
5   2018-03-08 09:30:00    Room1
6   2018-03-08 10:00:00    Room1
7   2018-03-08 10:30:00    Room1
8   2018-03-08 11:00:00    Room1
9   2018-03-08 11:30:00    Room1
10  2018-03-08 12:00:00    Room1
11  2018-03-08 12:30:00    Room1
12  2018-03-08 13:00:00    Room1
13  2018-03-08 13:30:00    Room1
14  2018-03-08 14:00:00    Room1
15  2018-03-08 14:30:00    Room1
16  2018-03-08 15:00:00    Room1
17  2018-03-08 15:30:00    Room1
18  2018-03-08 16:00:00    Room1
19  2018-03-08 16:30:00    Room1
20  2018-03-08 17:00:00    Room1
21  2018-03-08 17:30:00    Room1
22  2018-03-08 18:00:00    Room1
23  2018-03-08 18:30:00    Room1
24  2018-03-08 19:00:00    Room1
25  2018-05-18 07:00:00    Room1
26  2018-05-18 07:30:00    Room1
27  2018-05-18 08:00:00    Room1
28  2018-05-18 08:30:00    Room1
29  2018-05-18 09:00:00    Room1
..                  ...      ...
183 2018-07-27 11:00:00    Room1
184 2018-07-27 11:30:00    Room1
185 2018-07-27 12:00:00    Room1
186 2018-07-27 12:30:00    Room1
187 2018-07-27 13:00:00    Room1
188 2018-07-27 13:30:00    Room1
189 2018-07-27 14:00:00    Room1
190 2018-07-27 14:30:00    Room1
191 2018-07-27 15:00:00    Room1
192 2018-07-27 15:30:00    Room1
193 2018-07-27 16:00:00    Room1
194 2018-07-27 16:30:00    Room1
195 2018-07-27 17:00:00    Room1
196 2018-07-27 17:30:00    Room1
197 2018-07-27 18:00:00    Room1
198 2018-07-27 18:30:00    Room1
199 2018-07-27 19:00:00    Room1
200 2018-06-15 09:00:00    Room2
201 2018-06-15 09:30:00    Room2
202 2018-06-15 10:00:00    Room2
203 2018-06-15 10:30:00    Room2
204 2018-06-29 09:00:00    Room2
205 2018-06-29 09:30:00    Room2
206 2018-06-29 10:00:00    Room2
207 2018-06-29 10:30:00    Room2
208 2018-06-29 11:00:00    Room2
209 2018-08-17 10:00:00    Room2
210 2018-08-17 10:30:00    Room2
211 2018-08-17 11:00:00    Room2
212 2018-08-17 11:30:00    Room2

Другие вопросы по теме