日期范围重叠的数据框分组。

3

如何判断两行的日期范围是否有重叠?

输入数据框:

A B 开始时间 结束时间 时间戳
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 开始 结束 时间戳
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
2个回答

3

您可以使用以下方法:

  1. 如果日期不是datetime格式,可以选择将其转换为datetime格式
df['Start'] = pd.to_datetime(df['Start'])
df['End'] = pd.to_datetime(df['End'])
df['Timestamp'] = pd.to_datetime(df['Timestamp'])
  1. 将数值排序以便于在连续行之间进行日期比较
df = df.sort_values(['A', 'B', 'Start', 'End'])
  1. 为非重叠日期范围中相同的AB设置组号: 通过比较已排序行中的Start日期大于前一行的End日期(这将是非重叠日期范围)。所有组号都是相对于AB内的同一组。
group = (df['Start'] >  df.groupby(['A', 'B'])['End'].shift()).groupby([df['A'], df['B']]).cumsum()
  1. 按照 AB 分组,并通过新创建的 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

-1

熊猫数组将会帮助您 它是这样的... 数组(数据[,数据类型,复制])...

欲了解更多信息,请阅读文档... 我仍在寻找稳定的答案。

熊猫文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接