我如何知道两行的日期范围是否重叠?
输入数据框:
A |
B |
Start |
End |
Timestamp |
A1 |
B1 |
2022-01-15 |
2022-02-15 |
2021-05-17 |
A1 |
B1 |
2021-07-15 |
2021-10-17 |
2021-05-17 |
A1 |
B1 |
2021-07-30 |
2021-10-02 |
2021-05-16 |
A1 |
B2 |
2022-01-01 |
2023-01-01 |
2021-05-17 |
A1 |
B2 |
2021-06-02 |
2021-06-04 |
2021-05-16 |
A2 |
B3 |
2021-05-10 |
2021-05-12 |
2021-05-17 |
A2 |
B3 |
2021-04-10 |
2021-06-12 |
2021-05-16 |
A2 |
B4 |
2021-06-02 |
2021-06-04 |
2021-05-17 |
我想知道如何识别同一组的两行(A 和 B)之间是否存在重叠。例如,在第 0、1 和 2 行中,它们属于同一组(A1 和 B1),但第 1 行和第 2 行之间仅存在重叠,因为它们共享日期范围的一部分,因此我想要的是保留该行如果存在重叠,则具有最高时间戳。但例如在第 3 行和第 4 行中,尽管它们属于同一组(A1 和 B2),因为它们的日期之间没有重叠,但我想保留这两个日期。怎么可能呢?
预期数据框:
A |
B |
Start |
End |
Timestamp |
A1 |
B1 |
2022-01-15 |
2022-02-15 |
2021-05-17 |
A1 |
B1 |
2021-07-15 |
2021-10-17 |
2021-05-17 |
A1 |
B2 |
2022-01-01 |
2023-01-01 |
2021-05-17 |
A1 |
B2 |
2021-06-02 |
2021-06-04 |
2021-05-16 |
A2 |
B3 |
2021-05-10 |
2021-05-12 |
2021-05-17 |
A2 |
B4 |
2021-06-02 |
2021-06-04 |
2021-05-17 |
您可以使用:
- 如果日期尚未在日期时间中,则可以选择将日期转换为日期时间
df['Start'] = pd.to_datetime(df['Start'])
df['End'] = pd.to_datetime(df['End'])
df['Timestamp'] = pd.to_datetime(df['Timestamp'])
- 对值进行排序以方便连续行之间的日期比较
df = df.sort_values(['A', 'B', 'Start', 'End'])
- 设置同一组内的组号
A
and B
对于不重叠的日期范围:通过比较Start
排序行中的日期大于End
上一行的日期(这将是非重叠的日期范围)。所有组编号均相对于同一组内A
and B
.
group = (df['Start'] > df.groupby(['A', 'B'])['End'].shift()).groupby([df['A'], df['B']]).cumsum()
- 通过...分组
A
and B
和重叠的组号(由新创建的group
) 并获取最高索引Timestamp
by idxmax()
. Use .loc
过滤此类行(具有最高Timestamp
成组)保留。最后.sort_index()
在排序之前恢复原始数据帧的顺序。
df.loc[df.groupby([df['A'], df['B'], group])['Timestamp'].idxmax()].sort_index()
Result:
A B Start End Timestamp
0 A1 B1 2022-01-15 2022-02-15 2021-05-17
1 A1 B1 2021-07-15 2021-10-17 2021-05-17
3 A1 B2 2022-01-01 2023-01-01 2021-05-17
4 A1 B2 2021-06-02 2021-06-04 2021-05-16
5 A2 B3 2021-05-10 2021-05-12 2021-05-17
7 A2 B4 2021-06-02 2021-06-04 2021-05-17
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)