Pandas如何实现两个日期间按月份重复复制对应行数据
Pandas 按自然月展开日期间隔复制行实现
实现逻辑
针对每行的Start、End日期字段,核心是生成两个日期间覆盖的所有自然月1号的日期序列,再基于序列拆分复制原行,保留原End值,将Start替换为对应月份的1号即可。
完整实现代码
import pandas as pd # 1. 初始化示例数据(实际使用时替换为自己的数据集读取逻辑即可) df = pd.DataFrame({ 'ID': [1007, 1008], 'Start': ['2022-03-01', '2019-11-01'], 'End': ['2022-08-01', '2020-02-01'] }) # 2. 强制将日期列转为datetime格式,避免类型计算错误 df['Start'] = pd.to_datetime(df['Start']) df['End'] = pd.to_datetime(df['End']) # 3. 为每行生成区间内所有月度首日的序列,freq='MS'代表按每月1号取数 df['temp_month'] = df.apply( lambda row: pd.date_range(start=row['Start'], end=row['End'], freq='MS'), axis=1 ) # 4. 展开日期序列,替换Start字段,清理临时列 result = df.explode('temp_month', ignore_index=True) result['Start'] = result['temp_month'] result = result.drop(columns=['temp_month'])
结果验证
执行代码后输出的result完全匹配预期:
- ID=1007共生成6条记录,
Start依次为2022-03-01到2022-08-01的每月1号,End均为2022-08-01 - ID=1008共生成4条记录,
Start依次为2019-11-01到2020-02-01的每月1号,End均为2020-02-01
适配调整说明
如果原始数据中Start/End不是当月1号,上述代码默认会取两个日期所属自然月的全部月度首日;如果需要严格限制仅保留完整落在Start和End区间内的月份,可以在生成temp_month序列后增加过滤逻辑,判断生成的月度首日是否在原日期区间内即可。
内容的提问来源于stack exchange,提问作者Vanessa
相关产品推荐
相关产品推荐

