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

使用resample转换季度目标为月度目标,缺失11-12月数据求助

问题原因与解决方法

问题根源

  • 使用pd.to_datetime('2023-Q4')解析季度字符串时,pandas默认返回季度起始日期(如2023-Q4对应2023-10-01),而非季度结束日期。
  • 执行resample('M')时,生成的月度时间范围仅覆盖从最早数据日期(2023-01-01)到最晚数据日期(2023-10-01),因此最后一个月度是2023-10-31,11、12月不在该范围内,无法被填充。

解决方法

将季度日期转换为季度结束日期,让时间范围覆盖到2023-12-31,这样resample('M')就能生成完整的1-12月数据,再通过ffill填充对应季度的月度目标。

修改后代码

import pandas as pd

# 创建销售人员季度会议目标
quarters =  ['2023-Q1','2023-Q2','2023-Q3','2023-Q4']
anne =      [40,40,40,40]
martijn =   [40,40,40,40]
kevin =     [40,40,40,40]
danny =     [40,40,40,40]
rick =      [40,40,40,40]
fiona =     [35,35,35,35]
df = pd.DataFrame({
    'quarter': quarters, 
    'anne': anne, 
    'martijn': martijn, 
    'danny': danny, 
    'kevin': kevin, 
    'rick': rick, 
    'fiona': fiona
})

df_melted = df.melt(id_vars=['quarter'], var_name='sales person', value_name='meeting target') # 扁平化表格
df_melted['meeting target'] = df_melted['meeting target'].astype(float)/3 # 转换为月度目标并转浮点型
# 关键修改:将季度日期转为季度结束日期
df_melted['quarter'] = pd.to_datetime(df_melted['quarter']) + pd.offsets.QuarterEnd(0)

# 按销售人员分组,月度重采样并填充数据
df_melted = df_melted.set_index('quarter').groupby('sales person').resample('M')['meeting target'].ffill().round(2)
df_melted = df_melted.reset_index()
print(df_melted)

等价写法(使用Period转换)

如果觉得pd.offsets不够直观,也可以用pd.Period直接获取季度结束时间:

df_melted['quarter'] = pd.to_datetime(pd.Period(df_melted['quarter'], freq='Q').end_time)

内容的提问来源于stack exchange,提问作者John K Francisco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:55:20