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