Python识别每个ID的数据并将其组合成一个周期(使用开始日期和结束日期),其中一个周期被分割成多行

2024-05-16 05:18:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,如下所示:

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

对于ID200和ID372的前三条记录,我想将这些日期合并成一行。这是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

我更多的是一个分析bod,而不是一个数据争论者,因此任何帮助都将不胜感激


Tags: 数据iddate地方记录startendbod
1条回答
网友
1楼 · 发布于 2024-05-16 05:18:10

熊猫可以愉快地处理日期,但您应该将它们转换为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

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

相关问题 更多 >