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

Pandas多ID场景下季度数据转月度数据实现方法

pandas多ID场景季度粒度转月度粒度实现方案

该方案适配任意多ID、任意数量业务字段的数据集,所有非ID、非日期字段自动沿用对应季度首月的记录值,不需要手动枚举字段。

核心逻辑

单ID场景的全局重采样方案无法适配多ID的核心原因是没有做ID维度的隔离,只要按ID分组后单独为每个ID生成对应季度的全量月度序列,再做值填充即可。

实现步骤

  • 将date_month字段转换为pandas原生datetime类型,支撑后续日期计算
  • 对每条季度首月的记录,生成该季度覆盖的3个连续自然月(首月、次月、第三个月)的日期序列
  • 展开日期序列,保留原记录对应的ID和所有业务字段值
  • 格式化日期字段、重置索引得到最终结果

完整可运行代码

import numpy as np
import pandas as pd

# 构造示例输入数据
index = [0,1,2,3]
data_id = pd.Series([1,1,2,2], index=index)
price = pd.Series([20,41,61,68], index=index)
date_month = pd.Series(['2021-01','2021-04','2021-01','2021-04'], index=index)
df = pd.DataFrame({"id": data_id, "price": price, "date_month": date_month})

# 核心转换逻辑
df['date_month'] = pd.to_datetime(df['date_month'])
result = (
    df
    # 为每条季度首月记录生成对应季度的3个月份,MS代表月起始频率
    .assign(date_month=lambda x: x['date_month'].apply(lambda d: pd.date_range(d, periods=3, freq='MS')))
    # 展开日期列,将一条季度记录拆分为3条月度记录
    .explode('date_month')
    # 日期格式化为YYYY-MM字符串,和预期输出格式对齐
    .assign(date_month=lambda x: x['date_month'].dt.strftime('%Y-%m'))
    .reset_index(drop=True)
)

结果说明

运行代码后输出的结果和预期完全一致:

  • ID为1的2条季度记录拆分为6条月度记录,ID为2的2条季度记录拆分为6条月度记录,总计12条记录
  • price字段自动按季度填充:20对应2021年1-3月,41对应2021年4-6月,61对应ID=2的2021年1-3月,68对应ID=2的2021年4-6月
  • 如果数据集存在其他业务字段,逻辑会自动保留对应季度首月的取值,不需要额外修改代码

内容的提问来源于stack exchange,提问作者ash1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:54:17