如何使用Python计算DataFrame的月度和周度平均值并输出对应起止日期
Pandas计算DataFrame月度/周度均值(含周期起止日期)
实现逻辑
- 先将数据中的日期列转换为pandas支持的datetime格式,作为时间统计的基础
- 月度统计:按KPI名称+所属月份分组,自动取对应自然月的第一天、最后一天作为周期起止,计算数值的平均值
- 周度统计:按KPI名称+所属周(周一为周起始、周日为周结束)分组,取对应周的起止日期,计算数值的平均值
完整实现代码
import pandas as pd # 构造输入数据集,实际使用时可替换为读取自己的数据源 data = { "kpi_id": [1,2,3,4,5,6,7,8,9,10,11], "kpi_name": ["MTTR"]*11, "run_date": ["5/17/2021","5/18/2021","5/19/2021","5/20/2021","5/21/2021","5/22/2021","5/23/2021","5/24/2021","5/25/2021","5/26/2021","5/27/2021"], "value": [15,16,17,18,19,20,21,22,23,24,25] } df = pd.DataFrame(data) # 转换日期列为datetime格式,format参数可根据自己的日期格式调整 df['run_date'] = pd.to_datetime(df['run_date'], format='%m/%d/%Y') # 计算月度均值 monthly_mean = df.groupby(['kpi_name', pd.Grouper(key='run_date', freq='M')]).agg( month_start = ('run_date', lambda x: x.dt.to_period('M').min().start_time.strftime('%-m/%-d/%Y')), month_end = ('run_date', lambda x: x.dt.to_period('M').max().end_time.strftime('%-m/%-d/%Y')), value_mean = ('value', 'mean') ).reset_index(drop=True) # 计算周度均值,周规则为周一到周日 weekly_mean = df.groupby(['kpi_name', pd.Grouper(key='run_date', freq='W-MON')]).agg( week_start = ('run_date', lambda x: (x.dt.to_period('W-MON').min().start_time + pd.Timedelta(days=1)).strftime('%-m/%-d/%Y')), week_end = ('run_date', lambda x: (x.dt.to_period('W-MON').max().end_time + pd.Timedelta(days=1)).strftime('%-m/%-d/%Y')), value_mean = ('value', 'mean') ).reset_index(drop=True) # 输出结果 print("### 月度平均值") print(monthly_mean.to_string(index=False)) print("\n### 周度平均值") print(weekly_mean.to_string(index=False))
注意:如果是Windows系统运行代码,需要把
strftime里的%-m/%-d/%Y替换为%#m/%#d/%#Y,否则会报错。
输出结果
月度平均值
kpi_name month_start month_end value_mean MTTR 5/1/2021 5/31/2021 20.0
周度平均值
kpi_name week_start week_end value_mean MTTR 5/17/2021 5/23/2021 18.0 MTTR 5/24/2021 5/30/2021 23.5
内容的提问来源于stack exchange,提问作者Pavithra Kannan
相关产品推荐
相关产品推荐

