我有一个开始和结束时间列表my_list
,其中包含不同的开始和结束时间分组。
这些记录是由一名治疗师输入的患者的集体治疗疗程开始/结束时间。我需要将相似的时间分组在一起,以便可以检查分组中是否有3个以上的列表。因此,从9:00-11:00,当规则仅允许3位患者时,就有4位患者。
此question's答案提供了帮助,可帮助您找到给定列表中的所有重叠时间,而我已经尝试过发布在此处的解决方案的变体。但是我需要根据相似时间的组找到重叠时间。
my_list = [
[dt.time(8,45), dt.time(11,0)],
[dt.time(9,0), dt.time(11,0)],
[dt.time(9,15), dt.time(11,0)],
[dt.time(9,30), dt.time(11,0)],
[dt.time(12,30), dt.time(15,0)],
[dt.time(12,30), dt.time(15,0)],
[dt.time(12,45), dt.time(15,0)],
]
我需要将相似/重复/重叠的时间分组...
group_one = [
[dt.time(8,45), dt.time(11,0)],
[dt.time(9,0), dt.time(11,0)],
[dt.time(9,15), dt.time(11,0)],
[dt.time(9,30), dt.time(11,0)]
]
group_two = [
[dt.time(12,30), dt.time(15,0)],
[dt.time(12,30), dt.time(15,0)],
[dt.time(12,45), dt.time(15,15)]
]
最终,检查len(group_one) > 3
返回True
# Pseudo-code
for times in my_list:
if start or end times are equal to or overlap each other:
throw the times into separate, similar lists (or dicts where key = timeslot?)
else:
if start or end times....
解决方案可以是纯Python或Pandas,因为此数据来自数据框,并将在此处进行处理。我忍不住觉得熊猫有一种神奇的方法来做到这一点,只是卡住了!
编辑:更改了相关数据以匹配答案。
答案 0 :(得分:2)
假设您的数据框看起来像这样,并且没有Prune注释中指出的级联重叠。
df = pd.DataFrame([[datetime(2019, 8, 7, 8, 45),datetime(2019, 8, 7, 11)],
[datetime(2019, 8, 7, 9),datetime(2019, 8, 7, 11)],
[datetime(2019, 8, 7, 9, 15),datetime(2019, 8, 7, 11)],
[datetime(2019, 8, 7, 9, 30), datetime(2019, 8, 7, 11)],
[datetime(2019, 8, 7, 12, 30),datetime(2019, 8, 7, 15)],
[datetime(2019, 8, 7, 12, 30),datetime(2019, 8, 7, 15)],
[datetime(2019, 8, 7, 12, 45),datetime(2019, 8, 7, 15)],
[datetime(2019, 8, 7, 15, 30),datetime(2019, 8, 7, 17)],
[datetime(2019, 8, 7, 15, 30),datetime(2019, 8, 7, 17)],
[datetime(2019, 8, 7, 15, 45),datetime(2019, 8, 7, 17)],
[datetime(2019, 8, 7, 18, 30),datetime(2019, 8, 7, 19)],
[datetime(2019, 8, 7, 18, 30),datetime(2019, 8, 7, 19)],
[datetime(2019, 8, 7, 18, 45),datetime(2019, 8, 7, 19)]],
columns = ["start", "end"])
如果您问题中的数据结构与所有数据都一致,那么以下方法应该有效。如所指出的,如果有任何级联的情况,这将不起作用。
请注意,df['start']
需要排序才能使此过程正常工作。
idx = df.index[(df['end'].shift() <= df['start'])]
overlapping groups = np.split(df, idx)
这将产生DataFrames
的列表。
[ start end
0 2019-08-07 08:45:00 2019-08-07 11:00:00
1 2019-08-07 09:00:00 2019-08-07 11:00:00
2 2019-08-07 09:15:00 2019-08-07 11:00:00
3 2019-08-07 09:30:00 2019-08-07 11:00:00,
start end
4 2019-08-07 12:30:00 2019-08-07 15:00:00
5 2019-08-07 12:30:00 2019-08-07 15:00:00
6 2019-08-07 12:45:00 2019-08-07 15:00:00,
start end
7 2019-08-07 15:30:00 2019-08-07 17:00:00
8 2019-08-07 15:30:00 2019-08-07 17:00:00
9 2019-08-07 15:45:00 2019-08-07 17:00:00,
start end
10 2019-08-07 18:30:00 2019-08-07 19:00:00
11 2019-08-07 18:30:00 2019-08-07 19:00:00
12 2019-08-07 18:45:00 2019-08-07 19:00:00]