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

