Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—标识每个ID的数据并将其组合成一个周期(使用开始日期和结束日期),其中一个周期被分割成多行_Python_Dataframe_Datetime - Fatal编程技术网

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对原始数据进行排序,然后开始日期。