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

