汇总列中每个唯一元素的最大和最小日期

Summarizing max and min dates for each unique element of a column

我有一个非常大的数据框,如下所示:

Col1 StartDate  EndDate
A    4/5/2021   4/5/2021
A    4/6/2021   4/6/2021
A    4/11/2021  4/11/2021
B    10/25/2020 10/25/2020
B    10/26/2020 10/27/2020

我需要得到以下信息:

Col1 StartDate  EndDate
A    4/5/2021   4/6/2021
A    4/11/2021  4/11/2021
B    10/25/2020 10/27/2020

对于 Col1 的每个唯一元素,我获取最大连续天数,并使用这些连续天数的最大和最小值来创建新的 StartDateEndDate 列。

我不知道该怎么做。

使用 diff dt.days of StartDate, ne and cumsum 作为您的 groupby 键来获取连续几天的连续组:

# If required - cast StartDate & EndaDate to datetime dtype
df['StartDate'] = pd.to_datetime(df['StartDate'])
df['EndDate'] = pd.to_datetime(df['EndDate'])

(df.groupby(df['StartDate'].diff().dt.days.ne(1).cumsum())
 .agg({'Col1':'first','StartDate':'min', 'EndDate':'max'}))

[出局]

          Col1  StartDate    EndDate
StartDate                           
1            A 2021-04-05 2021-04-06
2            A 2021-04-11 2021-04-11
3            B 2020-10-25 2020-10-27

说明

df['StartDate'].diff().dt.days returns 与上一行的天数差异(对于日期而言是 timedelta):

0      NaN
1      1.0
2      5.0
3   -168.0
4      1.0
Name: StartDate, dtype: float64

.ne(1) 只是一个布尔值 - “不等于”1:

0     True
1    False
2     True
3     True
4    False
Name: StartDate, dtype: bool

最后,.cumsum() 是这个布尔值的累加和 Series,每个“组”由连续的天组成:

0    1
1    1
2    2
3    3
4    3
Name: StartDate, dtype: int32

更新

运行 删除最后一行: