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

时间:2019-08-07 16:26:29

标签: 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,当规则仅允许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,因为此数据来自数据框,并将在此处进行处理。我忍不住觉得熊猫有一种神奇的方法来做到这一点,只是卡住了!

编辑:更改了相关数据以匹配答案。

1 个答案:

答案 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]