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

Pandas按季度日期分组:不同财年末公司指标均值计算

按公司财年季度计算指标平均值的解决方案

刚好之前处理过不同财年公司的季度统计需求,给你一步步拆解怎么实现:

首先先确认你现有的季度日期框架是没问题的:

  • comp1用freq='3M'生成的是1/31、4/30、7/31、10/31的季度末,完美匹配财年末为1/31的公司季度划分
  • comp2用freq='Q'生成的是日历季度末(3/31、6/30、9/30、12/31),对应财年末12/31的常规公司

接下来假设我们已经有了带数值指标的数据集(我给你加了虚构的随机数据方便测试),核心需求是按各自公司的财年季度分组,计算指标平均值,具体步骤如下:

步骤1:给每个日期打上对应财年的季度标签

因为两家公司财年起始不同,得分别处理:

  • 财年末1/31的comp1:用pandas的Q-JAN频率,这个频率会把2月到次年1月划分为一个财年,对应的季度标签完全匹配你的日期
  • 财年末12/31的comp2:用默认的Q-DEC日历季度就行

代码实现(直接复用你的现有代码,补全逻辑):

import pandas as pd
import numpy as np

# 你提供的基础代码
comp1 = pd.date_range('1/31/2016', periods=8, freq='3M')
comp2 = pd.date_range('1/31/2016', periods=8, freq='Q')
quarters = pd.DataFrame([1] * 8 + [2] * 8, index=comp1.append(comp2), columns=['company'])

# 生成虚构的指标数据(模拟你的真实数据集)
np.random.seed(42)  # 固定随机种子方便复现
quarters['value'] = np.random.randn(16)

# 为每个公司生成财年季度标签
def assign_fy_quarter(row):
    if row['company'] == 1:
        # comp1财年末在1月,用Q-JAN分组
        return row.name.to_period('Q-JAN')
    else:
        # comp2用日历季度(财年末12月)
        return row.name.to_period('Q-DEC')

quarters['fy_quarter'] = quarters.apply(assign_fy_quarter, axis=1)

步骤2:分组计算季度平均值

有了标签之后,直接按company和fy_quarter分组求平均就行:

# 计算各公司各财年季度的指标平均值
quarterly_avg = quarters.groupby(['company', 'fy_quarter'])['value'].mean().reset_index()

# 打印结果看看
print(quarterly_avg)

进阶:更高效的无apply方案(大数据量适用)

如果你的数据集很大,apply的效率会偏低,我们可以拆分两家公司的数据分别处理,再合并结果:

# 拆分两家公司的数据
comp1_data = quarters[quarters['company'] == 1]
comp2_data = quarters[quarters['company'] == 2]

# 分别按各自财年季度分组求平均
comp1_avg = comp1_data.groupby(pd.Grouper(freq='Q-JAN', level=0))['value'].mean().reset_index()
comp2_avg = comp2_data.groupby(pd.Grouper(freq='Q-DEC', level=0))['value'].mean().reset_index()

# 合并结果并标注公司
quarterly_avg = pd.concat([
    comp1_avg.assign(company=1),
    comp2_avg.assign(company=2)
]).rename(columns={'index': 'fy_quarter'})

小技巧:自定义季度编号

如果你觉得Q-JAN生成的季度编号不符合你的习惯(比如它会把1月31日归为财年Q4,但你想把它作为Q1),可以手动调整标签:

# 针对comp1调整季度编号(把Q4和Q1互换,以此类推)
comp1_data['fy_quarter'] = comp1_data['fy_quarter'].astype(str).str.replace('Q4', 'temp').str.replace('Q1', 'Q4').str.replace('temp', 'Q1')

这样就能完美满足两家不同财年公司的季度均值计算需求啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:34:39