Python 查找重叠时间范围

Python 查找重叠时间范围,python,Python,我有以下数据,按开始时间按升序排序: --------------------------- Name | start | end | count| A | 3:00 | 4:00 | 6 | B | 3:00 | 4:00 | 6 | C | 3:00 | 4:00 | 6 | D | 3:00 | 3:30 | 6 | E | 3:32 | 4:00 | 6 | F | 4:01 | 5:00 | 6 |

我有以下数据,按开始时间按升序排序:

---------------------------
Name | start | end  | count|
A    | 3:00  | 4:00 | 6    |
B    | 3:00  | 4:00 | 6    |
C    | 3:00  | 4:00 | 6    |
D    | 3:00  | 3:30 | 6    |
E    | 3:32  | 4:00 | 6    |
F    | 4:01  | 5:00 | 6    |
----------------------------
我使用以下逻辑来查找重叠:

max(start1,start2) < min(end1,end2)

如果我正确理解了你的问题,如果你用一个图来表示你的数据,每一行有一个顶点,如果两行的时隙重叠,两行之间有一条边,那么你要寻找的是该图中的一组。使用您的输入数据,并使用查找派系:

将networkx导入为nx
G=nx.Graph()
G.add_nodes_from(['A','B','C','D','E','F'])
G.从(['A','B'],['A','C'],['A','D'],['A','E'],['B','C'],['B','D'],['B','D'],['B','E'],['C','D'],['C','E'])添加边
打印(列表(nx.find_派系(G)))
#输出:['A','C','B','E'],['A','C','B','D'],['F']]
您在评论中提到,您的数据实际上是以秒为单位的,所以让我假设您提供的输入是整数的时间。然后您可以使用上述方法,如下所示:

def重叠(df):
G=nx.Graph()
G.add_nodes_from(df.Name)
对于范围内的i(len(df)):
a=df.iloc[i]
对于范围(i+1,len(df))内的j:
b=df.iloc[j]
如果(a.start=b.start)或(b.start=a.start):
G.添加边(a.名称,b.名称)
对于nx中的派系。查找派系(G):
收益集团,df.set_index('Name').loc[clique]['count'].sum()
以你的例子:

[53]中的
:df
出[53]:
名称开始结束计数
0 A 180 240 6
1 B 180 240 6
2 C 180 240 6
三维180 210 6
4 E 212 240 6
5楼241300 6
In[54]:列表(重叠(df))
出[54]:[(['F'],6),(['B','C','A','D'],24),(['B','C','A','E'],24)]
或者,您感兴趣的是在任何给定时间(与上述不同)可能发生的重叠。注意到,唯一考虑的时间是那些作为开始或结束时间出现的时间,这些也很容易找到:

In[69]:集合(df.start.union(df.end))中t的集合(tuple(df[(df.start=t)].Name)
Out[69]:{('A','B','C','D'),('A','B','C','E'),('F',)}
此方法的使用方法与集团查找方法相同:

def重叠2(df):
对于集合(df.start.union(df.end))中t的集合(tuple(df[(df.start=t)].Name)中的重叠:
收益率重叠,df.set_索引('Name').loc[列表(重叠)]['count'].sum()
例如:

[88]中的
:列表(重叠2(df))
出[88]:[(('F',),6),('A','B','C','E',24),('A','B','C','D',24)]

作为一个不同的例子,考虑当一行添加了200的起始点和220的结尾时发生了什么:

[90]中的
:df
出[90]:
名称开始结束计数
0 A 180 240 6
1 B 180 240 6
2 C 180 240 6
三维180 210 6
4 E 212 240 6
5楼241300 6
6 G 200 220 3
In[94]:列表(重叠(df))
出[94]:[(['F'],6),(['G','B','C','A','D'],27),(['G','B','C','A','E'],27)]
In[95]:列表(重叠2(df))
出[95]:
[(('A','B','C','E','G'),27),
("F",6),,
((‘A’、‘B’、‘C’、‘D’、‘G’),27),
((‘A’、‘B’、‘C’、‘E’),24),
((‘A’、‘B’、‘C’、‘D’、24)]

哪个框架?熊猫?没有这样的框架。那都是字符串?这是相当低效的。如果有一行
G | 3:20 | 3:40 | 5
,预期的输出是什么?实际上不是。我有几秒钟的数据。但是对于表示,我在这里转换为实际时间,如果我们加上G,那么D和G之间有重叠,对吗?是的,这就是想法。重叠和重叠2之间的区别是什么?
overla2
在所有可能的时间提供可能的并发行<代码>重叠不重叠。从原始帖子中的措辞来看,不清楚哪一个是预期的(正如你所看到的,他们在给定的例子中给出了相同的结果)。感谢你提供了一个解决方案。我目前正在使用重叠功能。我注意到的一件事是,当我们有大量数据时,“find_cliques”方法会花费大量时间返回结果集。无论如何,我们是否可以优化此解决方案?
Expected Output
(A,B,C,D) - 24 - Overlap - Here E is not included since E is started by the time D is finished
(A,B,C,E) - 24 - overlap - D is excluded since its already over
(F) - 6 - No overlap