如何优化Pandas中时间序列数据的上采样均分实现方案?
优化方案:简洁高效的均分上采样
核心思路
先计算每个原始周期的日均数值,再通过上采样填充到周期内的每一天,彻底避免原代码中复杂的分组、transform操作,同时解决所有痛点问题。
基础实现(月度数据场景)
import pandas as pd # 原始月度成本数据 df = (pd.DataFrame([[pd.to_datetime('2023-01-01'), 31], [pd.to_datetime('2023-02-01'), 14]], columns=['time', 'cost'] ) .set_index("time") ) # 1. 计算每个周期的天数 # 中间行:用下一个周期起始日减当前周期起始日得到天数 period_days = (df.index.shift(1) - df.index).days # 最后一行:直接取当前月份的总天数 period_days.iloc[-1] = df.index[-1].days_in_month # 2. 计算日均数值(支持多列,直接对所有数值列批量操作) df_daily_avg = df.div(period_days, axis=0) # 3. 上采样到日,向前填充日均数值,覆盖整个周期 df_final = df_daily_avg.resample('D').ffill()
方案优势
- 支持多列数据:直接对整个DataFrame执行除法操作,无单列限制
- 无需硬编码原始频率:利用索引的
shift和days_in_month自动计算周期天数,适配月度数据 - 兼容非均匀索引:通过
shift(1)计算相邻周期的间隔天数,即使索引间隔不均匀也能正确处理 - 逻辑简洁清晰:三步完成需求,避免添加临时行、复杂分组等冗余操作
扩展:适配任意周期的通用版本
如果数据是任意间隔的datetime索引(比如部分间隔1个月、部分间隔2个月),可以自动计算所有周期的天数:
# 计算所有周期的结束日期:中间周期用下一个起始日,最后一个周期取当月最后一天 period_ends = df.index.shift(1).fillna(df.index[-1] + pd.offsets.MonthEnd(0)) # 计算每个周期的天数 period_days = (period_ends - df.index).days # 后续步骤与基础版一致 df_daily_avg = df.div(period_days, axis=0) df_final = df_daily_avg.resample('D').ffill()
内容的提问来源于stack exchange,提问作者Clej
相关产品推荐
相关产品推荐

