【问题标题】:Python - Identify and combine data into one period per ID (using start and end date) where one period has been split across multiple rowsPython - 识别数据并将数据组合到每个 ID 的一个期间(使用开始日期和结束日期),其中一个期间已被拆分为多行
【发布时间】:2020-10-07 12:11:10
【问题描述】:

我有一个如下的数据框:

ID   Start Date  End Date   
200  01/01/2020  03/01/2020 
200  04/01/2020  06/01/2020 
200  07/01/2020  09/01/2020 
200  18/05/2020  20/05/2020 
350  24/05/2020  27/05/2020 
350  01/06/2020  02/06/2020
372  04/06/2020  07/06/2020 
372  08/06/2020  10/06/2020

对于 ID 200 和 ID 372 的前三个记录,我想将这些日期合并为一行。这就是 ID 匹配的地方,并且结束日期比具有相同 ID 的记录的开始日期早一天。

我想要这个:

ID  Start Date  End Date
200 01/01/2020  09/01/2020
200 18/05/2020  20/05/2020
350 24/05/2020  27/05/2020
350 01/06/2020  02/06/2020
372 04/06/2020  10/06/2020

我更像是一个分析机构而不是数据管理员,因此我们将不胜感激。

【问题讨论】:

    标签: python dataframe datetime


    【解决方案1】:

    Pandas 可以愉快地处理日期,但您应该将它们转换为 pd.Timestamp 格式。然后 groupbyagg 应该会给出预期的结果。可能的代码:

    # First transform the date columns in datetime format
    df[['SD', 'ED']] = df[['Start Date', 'End Date']].transform(
        pd.to_datetime, dayfirst=True)
    
    # then shift the start date by one to detect contiguous rows
    df[['ID1', 'SD1']] = df[['ID', 'ED']].shift()
    
    # identify groups of rows to aggregate (same id and contiguous dates)
    df['row_id'] = ((df['ID']!=df['ID1'])
                    |(df['SD']!=df['SD1']+pd.offsets.Day(1))).cumsum()
    
    # groupby agg is now enough...
    result = df.groupby('row_id').agg(**{'ID': ('ID', min),
                    'Start Date': ('Start Date', min),
                    'End Date': ('End Date', max)}
                                      ).reset_index(drop=True)
    

    它按预期给出:

        ID  Start Date    End Date
    0  200  01/01/2020  09/01/2020
    1  200  18/05/2020  20/05/2020
    2  350  24/05/2020  27/05/2020
    3  350  01/06/2020  02/06/2020
    4  372  04/06/2020  10/06/2020
    

    这听起来像是黑魔法,在每一步之后打印数据帧,看看会发生什么......

    【讨论】:

    • 谢谢!似乎可行,我只需要按 ID 对原始数据进行排序,然后按开始日期。
    猜你喜欢
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多