Python 3实现季度时间序列转月度:将季度行拆分为3条月度行
嘿,这个需求我之前做季度数据转月度的时候刚好碰到过,用Pandas有好几种靠谱的实现方式,给你详细说说:
方案一:用
explode生成月度日期列表展开 这种方法直观,先给每个季度行生成对应的三个月日期列表,再拆分成多行,适合需要明确控制月度日期格式(月初/月末)的场景。
假设你的DataFrame长这样:
import pandas as pd df = pd.DataFrame({ 'quarter_date': ['2023Q1', '2023Q2', '2023Q3'], 'sales': [15000, 22000, 18000], 'region': ['North', 'South', 'East'] })
步骤如下:
- 把季度字符串转成季度起始的datetime类型(比如
2023Q1转成2023-01-01) - 给每个季度生成对应的三个月日期(这里用月初
MS频率,要是需要月末就换成M) - 用
explode把日期列表拆成单独行,最后清理多余列
代码实现:
# 转换季度日期为起始datetime df['quarter_start'] = pd.to_datetime(df['quarter_date']) # 生成每个季度对应的3个月度日期列表 df['month_dates'] = df['quarter_start'].apply( lambda x: pd.date_range(start=x, periods=3, freq='MS') ) # 展开列表为多行,清理无关列 df_monthly = df.explode('month_dates').drop(columns=['quarter_date', 'quarter_start']) df_monthly = df_monthly.rename(columns={'month_dates': 'month_date'})
最终输出的df_monthly就是每条季度数据拆成3条月度数据,其他字段完全保留。
方案二:用
resample快速重采样填充 如果你的时间列已经是datetime类型,这个方法更简洁,利用Pandas的重采样功能直接生成月度数据,并用前向填充复制季度值。
代码示例:
# 先把季度日期转成datetime并设为索引 df_indexed = df.set_index(pd.to_datetime(df['quarter_date'])) # 按月度(月初)重采样,用前向填充复制季度数据 df_monthly = df_indexed.resample('MS').ffill().reset_index() df_monthly = df_monthly.rename(columns={'index': 'month_date'})
注意:如果你的季度日期是季度末(比如
2023-03-31),记得用origin参数调整重采样的起始点,避免日期偏移:df_monthly = df_indexed.resample('MS', origin='start').ffill().reset_index()
方案三:用
repeat复制行后计算日期 这种方法先把每行复制3次,再给每组复制行添加月份偏移量,适合需要自定义日期计算逻辑的场景。
代码示例:
# 复制每行3次,重置索引 df_repeated = df.loc[df.index.repeat(3)].reset_index(drop=True) # 给每组3行添加0、1、2的月份偏移 df_repeated['month_offset'] = df_repeated.groupby(df_repeated.index // 3).cumcount() # 计算月度日期:季度起始日期 + 月份偏移 df_repeated['month_date'] = pd.to_datetime(df_repeated['quarter_date']) + pd.offsets.MonthOffset(df_repeated['month_offset']) # 清理多余列 df_monthly = df_repeated.drop(columns=['quarter_date', 'month_offset'])
这三种方法都能满足你的需求,选哪种看你对日期格式的要求和代码简洁性的偏好~
内容的提问来源于stack exchange,提问作者T.Steis
相关产品推荐
相关产品推荐

