按组将数据框日期拆分为单个最小最大日期范围

Posted

技术标签:

【中文标题】按组将数据框日期拆分为单个最小最大日期范围【英文标题】:Split Dataframe dates into individual min max date ranges by group 【发布时间】:2021-12-08 02:48:44 【问题描述】:

我有一个看起来像这样的数据框:

S.No  date          origin  dest    journeytype
1     2021-10-21    FKG      HYM    OP
2     2021-10-21    FKG      HYM    PK
3     2021-10-21    HYM      LDS    OP
4     2021-10-22    FKG      HYM    OP
5     2021-10-22    FKG      HYM    PK
6     2021-10-22    HYM      LDS    OP
7     2021-10-23    FKG      HYM    OP
8     2021-10-24    AVM      BLA    OP
9     2021-10-24    AVM      DBL    OP
10    2021-10-27    AVM      BLA    OP

我需要将单独的出发地、目的地和旅程类型拆分为单独的开始日期和结束日期列。

上述输入的输出数据框应如下所示:

start_date  end_date   origin   dest    journeytype
2021-10-21  2021-10-23  FKG     HYM     OP
2021-10-21  2021-10-22  FKG     HYM     PK
2021-10-21  2021-10-22  HYM     LDS     OP
2021-10-24  2021-10-24  AVM     BLA     OP
2021-10-24  2021-10-24  AVM     DBL     OP
2021-10-27  2021-10-27  AVM     BLA     OP

此外,如果任何组的日期不连续,则它们需要在结果中显示为单独的记录

【问题讨论】:

【参考方案1】:

如果可能,通过比较差异指定连续值,如果更大,例如 1 每组使用:

df['date'] = pd.to_datetime(df['date'])

g = df.groupby(['origin','dest','journeytype'])['date'].diff().dt.days.gt(1).cumsum()

df = (df.groupby(['origin','dest','journeytype', g], sort=False)['date']
        .agg(start_date='min', end_date='max')
        .reset_index())

df = df[['start_date', 'end_date','origin', 'dest', 'journeytype']]
print (df)
  start_date   end_date origin dest journeytype
0 2021-10-21 2021-10-23    FKG  HYM          OP
1 2021-10-21 2021-10-22    FKG  HYM          PK
2 2021-10-21 2021-10-22    HYM  LDS          OP
3 2021-10-24 2021-10-24    AVM  BLA          OP
4 2021-10-24 2021-10-24    AVM  DBL          OP
5 2021-10-27 2021-10-27    AVM  BLA          OP

【讨论】:

第二个df['date'] = pd.to_datetime(df['date'])是多余的吗? @Mohan - 复制错误。

以上是关于按组将数据框日期拆分为单个最小最大日期范围的主要内容,如果未能解决你的问题,请参考以下文章

从 pandas 的时间序列范围中查找最小和最大日期

使用 dplyr 按组将 NA 替换为上一个或下一个值

在 R 中:如何在两个日期之间按组对变量求和

大日期范围内的最小/最大日期值取决于值

按组将一列转换为多列

按名称分组的连续日期范围内的最小和最大日期