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

Pandas如何在两个日期间按年份为DataFrame生成对应数据行

Pandas 按两日期列覆盖年份拆分多行

实现逻辑

针对每条记录,提取起始日期、结束日期的年份,生成两个年份之间所有整数年份的序列(包含首尾年份),再将年份序列拆分为多行,其余字段自动保留原记录值。

前置要求

先将两个日期列转换为pandas的datetime64类型,避免年份提取失败。

完整代码示例

import pandas as pd

# ----------------------
# 1. 数据准备(替换为你自己的DataFrame即可)
# ----------------------
df = pd.DataFrame({
    'record_id': [1, 2],
    'date_start': ['2018-01-01', '2022-03-15'],
    'date_end': ['2020-01-01', '2023-06-20'],
    'other_info': ['demo1', 'demo2']
})

# 转换日期列类型
df['date_start'] = pd.to_datetime(df['date_start'])
df['date_end'] = pd.to_datetime(df['date_end'])

# ----------------------
# 2. 核心处理逻辑
# ----------------------
# 为每条记录生成覆盖的年份列表
df['year'] = df.apply(
    lambda row: list(range(row['date_start'].year, row['date_end'].year + 1)),
    axis=1
)
# 拆分年份列表为多行,重置索引
df_expanded = df.explode('year', ignore_index=True)

效果验证

以上示例中,record_id=1的原始记录日期为2018-01-01到2020-01-01,处理后会生成3行数据,year列取值分别为2018、2019、2020,其余字段和原记录完全一致,匹配需求。

注意事项

  • 若数据集规模超过100万行,apply写法性能会下降,可以换用numpy向量化运算优化,常规数据集下当前写法足够易用
  • 处理前建议先校验数据,过滤date_start > date_end的异常记录,避免生成空年份列表导致记录丢失
  • 若需要排除仅在1月1日出现的结束年份(比如2020-01-01不算入2020年),只需要把range的结束值从row['date_end'].year +1改成row['date_end'].year即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:18:15