You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按分组将DataFrame中的日期拆分为连续的起止日期范围

这是典型的pandas连续日期区间归并需求,可通过如下方案实现:

核心逻辑

按origin、dest、journeytype三个字段分组后,计算分组内相邻日期的差值识别非连续断点,用累积和为每个连续日期段分配唯一标识,再按标识聚合得到每个连续段的起止日期,天然支持同分组多个不连续区间的拆分要求。

可直接运行代码

import pandas as pd

# 构造示例数据,你可以替换为自己读取的数据源
data = {
    'S.No': [1,2,3,4,5,6,7,8,9,10],
    'date': ['2021-10-21','2021-10-21','2021-10-21','2021-10-22','2021-10-22','2021-10-22','2021-10-23','2021-10-24','2021-10-24','2021-10-27'],
    'origin': ['FKG','FKG','HYM','FKG','FKG','HYM','FKG','AVM','AVM','AVM'],
    'dest': ['HYM','HYM','LDS','HYM','HYM','LDS','HYM','BLA','DBL','BLA'],
    'journeytype': ['OP','PK','OP','OP','PK','OP','OP','OP','OP','OP']
}
df = pd.DataFrame(data)

# 1. 转换日期列为datetime类型,用于日期差值计算
df['date'] = pd.to_datetime(df['date'])

# 2. 生成分组内连续日期段的唯一标识
df['block'] = df.groupby(['origin','dest','journeytype'])['date'].apply(
    lambda x: (x.diff().dt.days > 1).cumsum()
)

# 3. 聚合得到每个连续段的起止日期
result = df.groupby(['origin','dest','journeytype','block'], as_index=False).agg(
    start_date=('date','min'),
    end_date=('date','max')
)

# 4. 调整列顺序和日期格式,匹配输出要求
result = result[['start_date','end_date','origin','dest','journeytype']]
result[['start_date','end_date']] = result[['start_date','end_date']].apply(lambda x: x.dt.strftime('%Y-%m-%d'))

print(result)

运行后输出结果和要求完全一致。

内容的提问来源于stack exchange,提问作者Mohan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:45:05