Python—标识每个ID的数据并将其组合成一个周期(使用开始日期和结束日期),其中一个周期被分割成多行
我有一个数据框,如下所示:Python—标识每个ID的数据并将其组合成一个周期(使用开始日期和结束日期),其中一个周期被分割成多行,python,dataframe,datetime,Python,Dataframe,Datetime,我有一个数据框,如下所示: 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
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
我更像是一个分析专家,而不是一个数据争论者,因此任何帮助都将不胜感激。熊猫可以愉快地处理日期,但你应该将它们转换为
pd.Timestamp
格式。然后,groupby
和agg
应该给出预期的结果。可能代码:
# 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对原始数据进行排序,然后开始日期。