从给定的开始结束时间算起每小时时间范围内的出现次数

时间:2018-09-07 08:11:26

标签: python pandas numpy plotly

我有一个数据集,其中包含不同会议室(从会议室日历中导出)的会议开始/结束时间,为期几个月。我想创建一个热图,该图将显示平均一天的每小时利用率(假设星期一)。 我制作了一个模型来显示我想要的结果: Wanted mock-up

这将在此Heatmap guide之后使用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

我想知道如何处理这些数据以创建平均一天和该天的每小时间隔,其中将包含预订的某些房间的出现次数。

谢谢

1 个答案:

答案 0 :(得分:0)

假设您的框架称为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