У меня есть набор данных, который содержит время начала / окончания встреч в разных комнатах для встреч (экспортировано из календаря комнат для встреч) за период в несколько месяцев. Я хотел бы создать тепловую карту, которая покажет использование в час в среднем за день (скажем, в понедельник). Я сделал макет, чтобы показать, чего я хочу в результате: Требуется макет
Это будет сделано с помощью 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
Мне интересно, как обработать эти данные, чтобы создать средние дневные и часовые интервалы в этот день, которые будут содержать количество появлений определенной забронированной комнаты.
Спасибо
Предполагая, что ваш фрейм называется 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