如何处理时间重叠并确定持续时间?Pandas Python



目前我已经成功地编写了一个程序,该程序允许我查找全部或部分时间重叠(请参阅具有相同编号的"group_overl"(。

出现两种情况:

  • 如果我有一个完全重叠,我必须删除第一个或第一个中包含的那个
  • 如果我有部分重叠,我必须从第二个开始并重新计算持续时间

为了更好地理解,这里有一个例子:

我的df:

alias          begin                      end                         duration    group_overl
0     M4            2019-10-21 07:39:26.356716  2019-10-21 07:42:02.574268  156.218     1
1     M4            2019-10-21 07:40:03.235327  2019-10-21 07:42:02.222821  118.987     1
2     M4            2019-10-21 07:42:52.299657  2019-10-21 07:43:19.834114  27.534      2
3     M4            2019-10-21 07:44:09.936458  2019-10-21 07:44:37.143862  27.207      3
4     M4            2019-10-21 07:45:27.488518  2019-10-21 07:45:54.122312  26.634      4
5     M4            2019-10-21 07:57:27.564887  2019-10-21 08:26:00.413448  1712.849    11
6     M4            2019-10-21 07:58:06.209659  2019-10-21 08:27:00.413448  1734.204    11

预期结果:

alias         begin                       end                         duration    
0     M4            2019-10-21 07:39:26.356716  2019-10-21 07:42:02.574268  156.218     
2     M4            2019-10-21 07:42:52.299657  2019-10-21 07:43:19.834114  27.534      
3     M4            2019-10-21 07:44:09.936458  2019-10-21 07:44:37.143862  27.207      
4     M4            2019-10-21 07:45:27.488518  2019-10-21 07:45:54.122312  26.634      
5     M4            2019-10-21 07:57:27.564887  2019-10-21 08:26:00.413448  1712.849    
6     M4            2019-10-21 08:26:00.413448  2019-10-21 08:27:00.413448  60 
正如您所看到的,第1行已经消失,因为它完全在第0行的时间内。行1已被删除
  • 行6部分地位于行5中。所以6的真正开始是5的结束。因此,我们在第6行的开始和结束之间进行新的区分,以获得新的持续时间(此处为60秒(
  • 我尝试了几种治疗方法,但都做不到,谢谢你抽出时间!

    由于我们使用的是shift(),因此此方法假设您已按begin列对数据帧进行了排序,如示例所示。听起来你不需要按alias:分组

    使用shift创建您提到的两个条件。对于第一种情况,过滤掉结果。对于第二个,请使用where()

    df['begin'] = pd.to_datetime(df['begin'])
    df['end'] = pd.to_datetime(df['end'])
    c1 = (df['begin'].between(df['begin'].shift(), df['end'].shift()) 
    & df['end'].between(df['begin'].shift(), df['end'].shift()))
    c2 = (df['begin'].between(df['begin'].shift(), df['end'].shift()) 
    & df['end'].gt(df['end'].shift()))
    df = df[~c1]
    df['duration'] = df['duration'].where(~c2, (df['end'] - df['end'].shift()).dt.seconds)
    df
    Out[1]: 
    alias                      begin                        end  duration  
    0    M4 2019-10-21 07:39:26.356716 2019-10-21 07:42:02.574268   156.218   
    2    M4 2019-10-21 07:42:52.299657 2019-10-21 07:43:19.834114    27.534   
    3    M4 2019-10-21 07:44:09.936458 2019-10-21 07:44:37.143862    27.207   
    4    M4 2019-10-21 07:45:27.488518 2019-10-21 07:45:54.122312    26.634   
    5    M4 2019-10-21 07:57:27.564887 2019-10-21 08:26:00.413448  1712.849   
    6    M4 2019-10-21 07:58:06.209659 2019-10-21 08:27:00.413448    60.000   
    group_overl  
    0            1  
    2            2  
    3            3  
    4            4  
    5           11  
    6           11
    

    如果要确保这些条件按组保持,则可以创建第三个条件,即它们必须在同一组中。确保你做

    df = df.sort_values(['alias','begin','end])然后:

    df['begin'] = pd.to_datetime(df['begin'])
    df['end'] = pd.to_datetime(df['end'])
    c1 = (df['begin'].between(df['begin'].shift(), df['end'].shift()) 
    & df['end'].between(df['begin'].shift(), df['end'].shift()))
    c2 = (df['begin'].between(df['begin'].shift(), df['end'].shift()) 
    & df['end'].gt(df['end'].shift()))
    c3 = df['alias'] == df['alias'].shift()
    df = df[~(c1 & c3)]
    df['duration'] = df['duration'].where(~(c2 & c3), (df['end'] - df['end'].shift()).dt.seconds)
    df
    Out[2]: 
    alias                      begin                        end  duration  
    0    M4 2019-10-21 07:39:26.356716 2019-10-21 07:42:02.574268   156.218   
    2    M4 2019-10-21 07:42:52.299657 2019-10-21 07:43:19.834114    27.534   
    3    M4 2019-10-21 07:44:09.936458 2019-10-21 07:44:37.143862    27.207   
    4    M4 2019-10-21 07:45:27.488518 2019-10-21 07:45:54.122312    26.634   
    5    M4 2019-10-21 07:57:27.564887 2019-10-21 08:26:00.413448  1712.849   
    6    M4 2019-10-21 07:58:06.209659 2019-10-21 08:27:00.413448    60.000   
    group_overl  
    0            1  
    2            2  
    3            3  
    4            4  
    5           11  
    6           11  
    

    相关内容

    • 没有找到相关文章

    最新更新