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

