按组将数据框日期拆分为单个最小最大日期范围
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 - 复制错误。以上是关于按组将数据框日期拆分为单个最小最大日期范围的主要内容,如果未能解决你的问题,请参考以下文章