首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用熊猫找到重叠的时间戳

使用熊猫找到重叠的时间戳
EN

Stack Overflow用户
提问于 2018-10-17 01:33:44
回答 1查看 771关注 0票数 0

我有一个包含启动时间、结束时间和transaction_ids的数据文件,如下所示:

代码语言:javascript
复制
    tid       starttime        endtime
0   0.0     1537204247.00   1537204309.00
1   1.0     1537204248.00   1537204309.00
2   21.0    1537207170.00   1537207196.00

我需要找到重叠的交易。到目前为止,我所能产生的最优化的代码如下:

代码语言:javascript
复制
p['overlap'] = False # This is my original dataframe

def compute_overlaps(df):
    for i, row_curr in df.iterrows():
        if( p.loc[row_curr['ix']]['overlap'] != True ):
            overlap_indexes = df[(row_curr['ix'] != df['ix']) & (row_curr['starttime'] < df['endtime']) & (df['starttime'] < row_curr['endtime'])].index
            p['overlap'].loc[row_curr['ix']] = True
            p['overlap'].loc[overlap_indexes] = True

<p_grouped_by_something>.apply(compute_overlaps)

输出:

代码语言:javascript
复制
    tid       starttime        endtime     overlap
0   0.0     1537204247.00   1537204309.00   True
1   1.0     1537204248.00   1537204309.00   True
2   21.0    1537207170.00   1537207196.00   False

注意,对于每个事务,我只需要确定它是否最多与另一个事务重叠。如果找到一个,我不需要检查所有其他事务;我可以在那里停止,并将其标记为重叠。

最初,我有一个嵌套的for循环,它使用iterrows,速度慢得令人讨厌。然后,我能够向量化内循环,但外部循环仍然存在。有没有办法将整个计算矢量化,使其运行得更快?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-17 01:57:53

您可以使用numpy广播

代码语言:javascript
复制
s1=df.starttime.values
s2=df.endtime.values
sum(np.minimum(s2[:,None],s2)-np.maximum(s1[:,None],s1)>0)>1
Out[36]: array([ True,  True, False])

说明:

1:超过一圈的距离

(x1,y1)与(x2,y2) min(y2,y1)-max(x1,x2)>0

第二:为什么它需要大于2,因为我使用numpy braod强制转换,所以对角线总是表示自己的比较。那我们需要更多的两个。

最新情况:

假设您有df和拆分df1 ....dfn (请看np.split)

代码语言:javascript
复制
s1=df.starttime.values
s2=df.endtime.values
l=[df1,df2,df3,df4,df5...]
n=[]
for  x in l: 
       n.append(sum(np.minimum(s2[:,None],x.values)-np.maximum(s1[:,None],x.values)>0)>1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52846129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档