Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何处理时间重叠并确定持续时间?熊猫蟒蛇_Python_Pandas_Dataframe_Datetime_Timestamp - Fatal编程技术网

Python 如何处理时间重叠并确定持续时间?熊猫蟒蛇

Python 如何处理时间重叠并确定持续时间?熊猫蟒蛇,python,pandas,dataframe,datetime,timestamp,Python,Pandas,Dataframe,Datetime,Timestamp,目前,我已经成功地编写了一个程序,允许我查找全部或部分时间重叠(请参阅相同编号的“group_overl”) 出现两种情况: 如果我有一个完整的重叠,我必须删除第一个中包含的一个或多个 如果有部分重叠,我必须从第二个开始,重新计算持续时间 为了更好地理解,以下是一个示例: 我的df: alias begin end duration group_overl 0

目前,我已经成功地编写了一个程序,允许我查找全部或部分时间重叠(请参阅相同编号的“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
列对数据帧进行排序,如示例所示。听起来您不需要按别名分组:

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

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

df=df.sort_值(['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  

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

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

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

df=df.sort_值(['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  

是否有多个
alias
值需要分组,或者该列是否全部
M4
?在这种情况下,所有列都带有“M4”,因为我已经分解了df。但是在另一个项目中,实际上groupby是受欢迎的。你认为
组中的行数应该超过2行吗?@QuangHoang是的,可能有多个
别名
值需要分组,或者该列都是
M4
?在这种情况下,所有列都带有“M4”,因为我已经分解了df。但是在另一个项目中,实际上groupby是受欢迎的。你认为一个
group\u over
group中会有超过2行吗?@QuangHoang是的,可能会有很多问题!如果我需要使用
groupby
,原因是多别名(按curuousity)?如果我有另一列用于
groupby
。对于您的代码,我只需要将其添加到
sort_values
c4=df['priority']==df['priority'].shift()df=df[~(c1&c3&c4)]中,并准确地修改
中的条件。你成功了!如果你能接受这个答案,我将不胜感激。非常感谢。where条件等于c2、c3和c4?非常感谢!如果我需要使用
groupby
,原因是多别名(按curuousity)?如果我有另一列用于
groupby
。对于您的代码,我只需要将其添加到
sort_values
c4=df['priority']==df['priority'].shift()df=df[~(c1&c3&c4)]中,并准确地修改
中的条件。你成功了!如果你能接受这个答案,我将不胜感激。非常感谢。何处条件等于c2、c3和c4?