【发布时间】:2021-07-01 14:08:09
【问题描述】:
我有一个包含一些房间调度数据的 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_TIME 和 END_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 answer 到Count 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 分钟为间隔,您考虑创建一个集,在其中标记每个声明的 15 分钟间隔。因此,使用您的开始时间和结束时间来创建一个范围,并使用一个 for 循环来检查一个区间是否已经在集合中,如果是则报告,如果不是则声明它。
标签: python python-3.x pandas dataframe