如何知道两行的日期范围是否重叠??
输入数据帧:
A | B | 开始结束 | >时间戳||
---|---|---|---|---|
A1 | B1 | 2022-01-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>
您可以使用:
- 如果日期不在datetime中,可以选择将日期转换为datetime
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
和B
内的组号:通过比较排序行中的Start
日期大于前一行的End
日期(这将是非重叠日期范围(。所有的组号都是相对于CCD_ 5和CCD_
group = (df['Start'] > df.groupby(['A', 'B'])['End'].shift()).groupby([df['A'], df['B']]).cumsum()
- 根据
A
和B
以及重叠组号(根据新创建的group
(进行分组,并通过idxmax()
获得最高Timestamp
的索引。使用.loc
筛选要保留的此类行(组中Timestamp
最高(。最后用.sort_index()
恢复排序前的原始数据帧序列
df.loc[df.groupby([df['A'], df['B'], group])['Timestamp'].idxmax()].sort_index()
结果:
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
Panda数组将对您有所帮助事情是这样的。。。数组(data[,dtype,copy](。。。
欲了解更多信息,请阅读文档。。。。我仍在寻找稳定的答案。
Panda文档