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
相关产品推荐
相关产品推荐

