gpt4 book ai didi

python - 计算每周房间时间表中的重叠时间

转载 作者:行者123 更新时间:2023-12-04 15:00:57 25 4
gpt4 key购买 nike

我有一个包含一些房间调度数据的 DataFrame。
以下是周四和周五早上前几个条目的数据示例:

   DAYS BEGIN_TIME END_TIME
0 R 09:00 10:15
1 R 08:30 09:45
2 R 11:30 12:20
3 R 11:30 12:45
4 F 08:00 10:30
5 F 07:00 08:15
6 F 08:00 10:30
作为python定义:
df = pd.DataFrame({'DAYS': {0: 'R', 1: 'R', 2: 'R', 3: 'R', 4: 'F', 5: 'F', 6: 'F'},
'BEGIN_TIME': {0: '09:00', 1: '08:30', 2: '11:30', 3: '11:30', 4: '08:00', 5: '07:00', 6: '08:00'},
'END_TIME': {0: '10:15', 1: '09:45', 2: '12:20', 3: '12:45', 4: '10:30', 5: '08:15', 6: '10:30'}}
)
R代表星期四和 F代表星期五。还有 M , T , 和 W在此列中。 BEGIN_TIMEEND_TIME表示某人使用房间的开始和结束时间,以小时和分钟为单位,采用 24 小时制,HH:MM。
我想确定房间发生碰撞的日期和时间(多人试图同时使用房间)。
对于示例数据,我想收到如下内容:
    DAYS BEGIN_TIME END_TIME   USERS
0 R 08:30 9:00 1
1 R 09:00 9:45 2
2 R 09:45 10:15 1
3 R 11:30 12:20 2
4 R 12:20 12:45 1
5 F 07:00 8:00 1
6 F 08:00 08:15 3
7 F 08:15 10:30 2
到目前为止,在我的研究中,我发现了 this answerCount overlapping time frames in a pandas dataframe, grouped by person .
import pandas as pd

df = pd.DataFrame({'DAYS': {0: 'R', 1: 'R', 2: 'R', 3: 'R', 4: 'F', 5: 'F', 6: 'F'},
'BEGIN_TIME': {0: '09:00', 1: '08:30', 2: '11:30', 3: '11:30', 4: '08:00', 5: '07:00', 6: '08:00'},
'END_TIME': {0: '10:15', 1: '09:45', 2: '12:20', 3: '12:45', 4: '10:30', 5: '08:15', 6: '10:30'}}
)

# Convert to DateTime
df["BEGIN_TIME"] = df["BEGIN_TIME"].astype("datetime64[ns]")
df["END_TIME"] = df["END_TIME"].astype("datetime64[ns]")

# Code from linked SO Answer
ends = df['BEGIN_TIME'].values < df['END_TIME'].values[:, None]
starts = df['BEGIN_TIME'].values > df['BEGIN_TIME'].values[:, None]
same_group = (df['DAYS'].values == df['DAYS'].values[:, None])
df['OVERLAP'] = (ends & starts & same_group).sum(1)

print(df)
虽然这确实告诉了我某些冲突,但在尝试具体查找发生冲突的时间时无济于事。
我也看了 Pandas: Count time interval intersections over a group by但这里的答案也只是着眼于计算重叠,而不是将范围分解为特定的重叠时间。
我不知道从哪里开始,有人能指出我正确的方向吗?

最佳答案

为每一天创建一个所有 15 分钟间隔的数据帧(约会的节奏)。然后我们可以使用 np.braodcasting查看每天给定时间有多少用户在使用房间。

import pandas as pd
import numpy as np

# Convert your times to a numeric type.
for col in ['BEGIN_TIME', 'END_TIME']:
df[col] = pd.to_datetime(df[col])
df[col] = df[col] - df[col].dt.normalize()

# 15-min blocks Monday-Friday
df1 = (pd.concat([pd.DataFrame({'Time': pd.timedelta_range('00:00:00', '23:45:00', freq='15min')})]*5,
keys=list('MTWRF'), names=['Days', 'to_drop'])
.reset_index()
.drop(columns='to_drop'))

# For each day determine the overlap
l = []
for day, gp in df1.groupby('Days'):
gp['users'] = ((gp['Time'].to_numpy() >= df.loc[df.DAYS.eq(day), 'BEGIN_TIME'].to_numpy()[:, None])
& (gp['Time'].to_numpy() <= df.loc[df.DAYS.eq(day), 'END_TIME'].to_numpy()[:, None])).sum(axis=0)
l.append(gp['users'])

# Join the results back to our 15 minute skeleton
df1 = pd.concat([df1, pd.concat(l)], axis=1)
#Check and see the times on Thursday
df1.loc[df1.Days.eq('R') & df1.Time.between('07:00:00', '14:00:00')]

Days Time users
316 R 0 days 07:00:00 0
317 R 0 days 07:15:00 0
318 R 0 days 07:30:00 0
319 R 0 days 07:45:00 0
320 R 0 days 08:00:00 0
321 R 0 days 08:15:00 0
322 R 0 days 08:30:00 1
323 R 0 days 08:45:00 1
324 R 0 days 09:00:00 2
325 R 0 days 09:15:00 2
326 R 0 days 09:30:00 2
327 R 0 days 09:45:00 2
328 R 0 days 10:00:00 1
329 R 0 days 10:15:00 1
330 R 0 days 10:30:00 0
331 R 0 days 10:45:00 0
332 R 0 days 11:00:00 0
333 R 0 days 11:15:00 0
334 R 0 days 11:30:00 2
335 R 0 days 11:45:00 2
336 R 0 days 12:00:00 2
337 R 0 days 12:15:00 2
338 R 0 days 12:30:00 1
339 R 0 days 12:45:00 1
340 R 0 days 13:00:00 0
341 R 0 days 13:15:00 0
342 R 0 days 13:30:00 0
343 R 0 days 13:45:00 0
344 R 0 days 14:00:00 0

关于python - 计算每周房间时间表中的重叠时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66957663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com