如何基于2012-2023年时序数据计算月度平均功率构建基准年
构建月度平均基准线(参考年)的Pandas解决方案
我拥有2012年至2023年的历史数据,希望计算这些年份中每个月份的平均值,以构建“参考年”或“基准线”。我的DataFrame(final_df)结构如下:
Timestamp bruttoPower [kW] nettoPower [kW] 0 2012-01-01 00:00:00 1501.500000 375.375000 1 2012-01-01 01:00:00 1488.833333 372.208333 2 2012-01-01 02:00:00 1626.833333 406.708333 3 2012-01-01 03:00:00 1350.333333 337.583333 4 2012-01-01 04:00:00 1424.000000 356.000000 ... ... ... ... 105187 2023-12-31 19:00:00 3301.758391 763.500000 105188 2023-12-31 20:00:00 2322.399977 592.500000 105189 2023-12-31 21:00:00 3393.225006 861.000000 105190 2023-12-31 22:00:00 3784.991643 952.000000 105191 2023-12-31 23:00:00 3661.591654 950.500000 105192 rows × 5 columns
尝试过的无效方法
- 参考过同类问题的解法但未成功
- ChatGPT给出的代码逻辑错误,它按年和月分组求和,完全不符合“计算所有年份对应月份平均值”的需求:
final_df.reset_index(inplace=True) final_df['Year'] = final_df['Timestamp'].dt.year final_df['Month'] = final_df['Timestamp'].dt.month df_new = final_df.groupby(['Year', 'Month']).sum() df_new.reset_index(inplace=True) display(df_new)
期望输出格式
希望得到按月份排序的月度平均值,示例如下:
Month bruttoPower [kW] nettoPower [kW] 0 Jan 1501.500000 375.375000 1 Feb 1488.833333 372.208333 2 Mar 1626.833333 406.708333 3 Apr 1350.333333 337.583333 4 May 1424.000000 356.000000 ... ... ... ... 10 Nov 3393.225006 861.000000 11 Dec 3784.991643 952.000000
正确解决方案
方法一:直接提取月份缩写并分组求平均
如果数据中每个月份都有记录,可直接按月份缩写分组,保持首次出现的顺序:
import pandas as pd # 确保Timestamp列为datetime类型(若尚未转换) final_df['Timestamp'] = pd.to_datetime(final_df['Timestamp']) # 提取月份缩写(如Jan、Feb) final_df['Month'] = final_df['Timestamp'].dt.month_name().str[:3] # 按月份分组计算平均值,sort=False保留原始出现顺序 reference_year = final_df.groupby('Month', sort=False)[['bruttoPower [kW]', 'nettoPower [kW]']].mean().reset_index() # 查看结果 print(reference_year)
方法二:强制按1-12月顺序排序(更稳妥)
如果需要确保结果严格按1月到12月排序,可先按月份数字分组,再替换为月份缩写:
import pandas as pd final_df['Timestamp'] = pd.to_datetime(final_df['Timestamp']) # 提取月份数字 final_df['Month_num'] = final_df['Timestamp'].dt.month # 按月份数字分组计算平均值 reference_year = final_df.groupby('Month_num')[['bruttoPower [kW]', 'nettoPower [kW]']].mean().reset_index() # 映射月份数字到缩写 month_map = { 1: 'Jan', 2: 'Feb', 3: 'Mar', 4: 'Apr', 5: 'May', 6: 'Jun', 7: 'Jul', 8: 'Aug', 9: 'Sep', 10: 'Oct', 11: 'Nov', 12: 'Dec' } reference_year['Month'] = reference_year['Month_num'].map(month_map) # 调整列顺序 reference_year = reference_year[['Month', 'bruttoPower [kW]', 'nettoPower [kW]']] # 查看结果 print(reference_year)
内容的提问来源于stack exchange,提问作者snkm
相关产品推荐
相关产品推荐

