【问题标题】:Overlap in date range grouped dataframe日期范围分组数据框中的重叠
【发布时间】:2021-09-22 11:43:31
【问题描述】:

我如何知道两行是否在其日期范围内重叠??

输入数据框:

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

【问题讨论】:

    标签: python pandas dataframe date


    【解决方案1】:

    你可以使用:

    1. 如果尚未在日期时间中,可选择将日期转换为日期时间
    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
    

    【讨论】:

      【解决方案2】:

      熊猫数组将为您提供帮助 它是这样的......数组(数据[,dtype,复制])......

      有关更多信息,请阅读文档....我仍在为此寻找稳定的答案。

      Panda docs

      【讨论】:

        猜你喜欢
        • 2021-09-06
        • 1970-01-01
        • 1970-01-01
        • 2015-11-18
        • 2013-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-03
        相关资源
        最近更新 更多