行6部分地位于行5中。所以6的真正开始是5的结束。因此,我们在第6行的开始和结束之间进行新的区分,以获得新的持续时间(此处为60秒(
目前我已经成功地编写了一个程序,该程序允许我查找全部或部分时间重叠(请参阅具有相同编号的"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已被删除
我尝试了几种治疗方法,但都做不到,谢谢你抽出时间!
由于我们使用的是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