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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:15:34