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

