在Python中查找相似或重叠的时间组

在Python中查找相似或重叠的时间组,python,pandas,Python,Pandas,我有一个开始和结束时间的列表,my_list,其中包含开始和结束时间的不同分组 8:45-11:00 9:00-11:00 9:15-11:00 9:30-11:00 12:30-15:00 12:30-15:00 12:45-15:00 这些记录是由一位治疗师输入的患者团体治疗会话开始/结束时间。我需要将类似的时间分组在一起,以便检查分组中是否有3个以上的列表。所以从9:00到11:00,有4名患者,而规则只允许3名患者 这些答案为在一个给定的列表中查找所有重叠的时间提供了帮助,我已经尝试

我有一个开始和结束时间的列表,
my_list
,其中包含开始和结束时间的不同分组

  • 8:45-11:00
  • 9:00-11:00
  • 9:15-11:00
  • 9:30-11:00
  • 12:30-15:00
  • 12:30-15:00
  • 12:45-15:00
这些记录是由一位治疗师输入的患者团体治疗会话开始/结束时间。我需要将类似的时间分组在一起,以便检查分组中是否有3个以上的列表。所以从9:00到11:00,有4名患者,而规则只允许3名患者

这些答案为在一个给定的列表中查找所有重叠的时间提供了帮助,我已经尝试了发布在那里的各种解决方案。但我需要根据相似时间的组来找到重叠时间

myu列表=[
[dt.时间(8,45),dt.时间(11,0)],
[dt.时间(9,0),dt.时间(11,0)],
[dt.时间(9,15),dt.时间(11,0)],
[dt.时间(9,30),dt.时间(11,0)],
[dt.时间(12,30),dt.时间(15,0)],
[dt.时间(12,30),dt.时间(15,0)],
[dt.时间(12,45),dt.时间(15,0)],
]
我需要对相似/重复/重叠的时间进行分组

第一组=[
[dt.时间(8,45),dt.时间(11,0)],
[dt.时间(9,0),dt.时间(11,0)],
[dt.时间(9,15),dt.时间(11,0)],
[dt.时间(9,30),dt.时间(11,0)]
]
第二组=[
[dt.时间(12,30),dt.时间(15,0)],
[dt.时间(12,30),dt.时间(15,0)],
[dt.时间(12,45),dt.时间(15,15)]
]
最后,检查
len(第一组)>3将返回
True

#伪代码
对于我的_列表中的时间:
如果开始时间或结束时间相等或重叠:
将时间放入单独的类似列表中(或dict,其中key=timeslot?)
其他:
如果开始或结束时间。。。。
解决方案可以是纯Python或Pandas,因为这些数据来自数据帧,并将在那里进行操作。我忍不住觉得在熊猫身上有一种神奇的方法,就是卡住了


编辑:更改问题中的数据以匹配答案。

假设您的数据帧看起来像这样,并且没有如注释中所指出的级联重叠

如果您问题中的数据结构与您的所有数据一致,那么以下内容应该可以使用。如前所述,如果存在任何级联情况,这将不起作用


注意,
df['start']
需要进行排序才能使此过程正常运行



结束时间是否总是与您的示例相同?熊猫系列的结构如何?那么
my_list
是如何创建的呢?如何处理层叠重叠?例如,以9-12、10-2和1-3为间隔,您的分组是什么?第一个和最后一个不重叠,但每个都与中间重叠。@如果不是,每个开始/结束时间可能不同。例如,四组不同的时间可能只共享9:45-10的时间:00@Josmoor98df中的每一行都包含StartTime和EndTime列。基于另一列值的groupby,我将它们全部放入一个列表中。@那是不会发生的。已设置组计划时间。时间的变化仅仅意味着患者早/晚来,或早/晚离开将第一次开始时间更改为
datetime(2019,8,7,8,45)
会减少重叠组。更新后,它也没有赶上最后一组<代码>np。拆分
解决了提出的问题。如果还有其他问题,请告诉我修改一个与另一个时间冲突的结束时间会将其丢弃。例如,
datetime(2019,8,7,9,30)、datetime(2019,8,7,12,30)
将此记录添加到第二个分组中,而它应该位于第一个分组中。要解决该特定问题,可以使用
idx=df.index[(df['end'].shift()
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"])
idx = df.index[(df['end'].shift() <= df['start'])]
overlapping groups = np.split(df, idx)
[                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]