You need to enable JavaScript to run this app. Python pandas无估算将年度粒度DataFrame转换为月度粒度
优惠活动
大模型
产品
解决方案
定价
更多

Python pandas无估算将年度粒度DataFrame转换为月度粒度

正确实现方案

之前代码失效的核心原因

  • 原数据的date列是字符串格式,不满足resample操作要求的datetime时间类型,pandas无法正常识别时间维度
  • 你使用的resample('M')默认输出每月最后一天的日期,和你需要的每月1号的目标格式不匹配;且resample本质是时间分组聚合逻辑,直接套lambda表达式无法实现原行无改动、重复12次的需求

可直接运行的实现代码

全程不涉及任何插值、估算逻辑,完全按照原行1:1重复拆分到每个月:

import pandas as pd

# 加载原始年度粒度数据
df = pd.DataFrame({
    "date": ["2020-01-01", "2021-01-01", "2022-01-01"],
    "cost": [100, 1000, 150],
    "person": ["Tom","Jerry","Brian"]
})

# 1. 把字符串格式的date列转换为pandas可识别的datetime类型
df['date'] = pd.to_datetime(df['date'])

# 2. 为每一行年度数据,生成对应自然年12个月初的日期序列
df['monthly_date'] = df['date'].apply(
    lambda year_start: pd.date_range(
        start=year_start, 
        end=year_start + pd.DateOffset(years=1) - pd.DateOffset(days=1), 
        freq='MS'
    )
)

# 3. 把嵌套的日期序列炸开为独立行,整理列得到最终结果
result = (
    df.explode('monthly_date', ignore_index=True)
    .drop(columns=['date'])
    .rename(columns={'monthly_date': 'date'})
)

结果校验

最终生成的result共36行:

  • 每一年对应的cost、person字段和原年度行完全一致,没有任何数值修改
  • 日期列覆盖对应自然年1-12月的每月1号,和示例要求的输出格式完全匹配

补充说明:如果强行使用resample实现该需求,需要将resample频率改为月初'MS',同时关闭分组聚合逻辑,但该方式对入门用户来说逻辑不直观,很容易出现空值填充、日期错位的问题,不如上述explode方案清晰可控。


内容的提问来源于stack exchange,提问作者M.wol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 08:06:04