如何拆分含剩余能源峰值的数据集并计算各峰值面积
解决能源峰值能量计算问题
步骤1:标记连续峰值组
首先将连续的非零数据段标记为同一分组,零值数据排除在分组外:
import pandas as pd import numpy as np # 加载数据(示例数据) df = pd.DataFrame() df['Value'] = [0, 0, 0, 0, 1, 1, 0, 1, 2, 4, 3, 0, 4, 0, 1, 0, 4, 0, 1, 0] df['Timestamp'] = pd.date_range(start='1/1/2018', periods=len(df), freq='15T') # 生成峰值组ID:连续非零区域分配同一ID,零值标记为NaN df['peak_group'] = df['Value'].ne(0).cumsum().where(df['Value'].ne(0))
df['Value'].ne(0):生成布尔列,标记所有非零数据cumsum():每次遇到非零值时累加,让连续非零数据拥有相同的组IDwhere(df['Value'].ne(0)):将零值对应的组ID设为NaN,避免分组时包含无效的零值段
步骤2:计算每个峰值的能量总量
由于数据是固定15分钟间隔(0.25小时),采用梯形法计算曲线下面积(能量),比简单求和更准确:
# 方法1:通用型计算(支持非固定时间间隔) peak_energy = df.groupby('peak_group').apply( lambda x: np.trapz(x['Value'], x['Timestamp'].astype('int64') / 3.6e12) ).reset_index(name='total_energy_kWh') # 方法2:固定间隔优化计算(效率更高,适合大数据量) # peak_energy = df.groupby('peak_group').apply( # lambda x: (x['Value'].rolling(2).mean().dropna() * 0.25).sum() # ).reset_index(name='total_energy_kWh') print(peak_energy)
- 方法1中,
x['Timestamp'].astype('int64') / 3.6e12将纳秒时间戳转换为小时数,np.trapz自动用梯形法计算曲线下面积 - 方法2利用固定间隔特性,计算相邻两点的平均值乘以时间间隔(0.25小时)后求和,结果与方法1完全一致,计算速度更快
结果说明
示例数据的输出如下,每一行对应一个独立峰值,total_energy_kWh为该峰值的总能量(假设Value单位为kW):
peak_group total_energy_kWh 0 1 0.50 1 2 2.25 2 3 1.00 3 4 0.25 4 5 1.00 5 6 0.25
大数据量适配
该方法针对近一年的15分钟数据(约3.5万条)完全适用,Pandas的groupby和apply操作在该数据量下性能优异,无需手动处理。
内容的提问来源于stack exchange,提问作者rsvdv
相关产品推荐
相关产品推荐

