问题背景与目标

在含光伏的园区或小型工业场景中,通常存在多台可调节负荷设备,例如高温热泵、空气源热泵等。这类设备具有一定的柔性,可以在一定范围内增加或减少用电功率,用于配合电网进行削峰填谷和需求响应。

调度侧和聚合商在实际决策中关心两个问题:一是不同时间尺度下,这些设备能够提供多大规模的上调和下调能力;二是在给定补贴价格的条件下,参与需求响应的经济收益如何。只有在这两点明确之后,后续的优化调度、策略设计才具有现实基础。

本文围绕一段基于 Python 的实现,构建了从原始数据到三种时间尺度(日前、日内、实时)可调节能力评估,再到经济收益估算的完整过程,对算法逻辑和实现细节进行拆解,同时讨论该方法在工程和研究中的意义。

时间尺度与总体思路

电力系统调度通常采用分层分时的决策结构。本文的实现对应三个典型时间尺度:

  • 日前层次,时间分辨率为 1 小时,基于过去 7 天的历史数据构造“典型日小时负荷曲线”,用于评估次日各小时的可调节能力。

  • 日内层次,时间分辨率为 15 分钟,从当前时刻起向后取约 4 小时的时间窗口,基于历史 7 天的 15 分钟平均负荷计算未来短期的可调节能力。

  • 实时层次,时间分辨率为 5 分钟,直接基于当前实时测得的功率,计算此刻瞬时的上调和下调空间。

在每一个时间尺度上,计算步骤基本一致:首先对历史负荷进行时间聚合和统计,得到期望负荷水平;然后结合设备额定功率和当前功率,计算上调和下调潜力;最后在给定补贴价格与选定响应时间段的情况下,汇总得到需求响应收益。

输入数据及结构

实现中使用若干 Excel 文件作为输入。具体文件内容不在文中给出,只说明数据结构形式,便于使用者替换为自身数据。

历史功率数据(例如 全部数据.xlsx):包含过去 7 天每 5 分钟的功率测量值。按行存储时间序列,按列区分不同设备。若记时间点总数为 $N$,设备数量为 $M$,则读入后形成形状约为 $(N, M)$ 的数组。

额定功率(例如 额定功率.xlsx):每台设备的额定功率 $P_{n,i}$,读入后为长度为 $M$ 的一维向量。

实时功率(例如 实时功率.xlsx):当前时刻各设备的实时功率 $P_{d,i}$,同样为长度为 $M$ 的一维向量。

补贴价格(例如 补贴价格.xlsx):二维矩阵,用行区分上调/下调,用列区分日前、日内、实时。可记为

响应时间段(例如 日前响应时间.xlsx、日内响应时间.xlsx):日前响应时间段 $t1 = [h{\text{start}}, h{\text{end}}]$ 以小时索引表示,日内响应时间段 $t_2 = [\tau{\text{start}}, \tau_{\text{end}}]$ 以 15 分钟段索引表示,其中一天包含 96 个 15 分钟段。

削峰填谷类型(例如 削峰填谷类型.xlsx):长度为 3 的向量 $x = (x_1, x_2, x_3)$,分别对应日前、日内、实时的响应方向设定。取值 1 表示采用上调潜力(通常对应填谷),取值 2 表示采用下调潜力(通常对应削峰)。

Python 中的典型读取方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pandas as pd
import numpy as np
from datetime import datetime

file = pd.read_excel('全部数据.xlsx', header=None).values
col_num = file.shape[1]

P_eding = pd.read_excel('额定功率.xlsx', header=None).values.flatten()
P_shishi = pd.read_excel('实时功率.xlsx', header=None).values.flatten()

c = pd.read_excel('补贴价格.xlsx', header=None).values

t1 = pd.read_excel('日前响应时间.xlsx', header=None).values.flatten()
t2 = pd.read_excel('日内响应时间.xlsx', header=None).values.flatten()

fg = pd.read_excel('削峰填谷类型.xlsx', header=None).values.flatten()

now = datetime.now()
t = 4 * now.hour + now.minute // 15 # 当前在 96 个 15 分钟段中的索引

至此,原始数据与参数已加载完成。

可调节能力的定义与典型日构造

为便于统一描述,考虑第 $i$ 台设备,额定功率为 $P{n,i}$,在某一时间尺度上的期望负荷记为 $P{\text{hist},i}(k)$,当前实时功率为 $P_{d,i}$。

在任一时间尺度上,上调潜力与下调潜力分别定义为

由于历史平均可能超过额定功率(或出现其他异常),实际实现中会对上调和下调潜力进行非负截断,例如通过 np.maximum(P_up, 0)np.maximum(P_down, 0) 保证结果可直接参与叠加与收益评估。

需要基于过去 7 天的 5 分钟采样数据构造“典型日”负荷曲线。设原始功率序列为 $P(k)$,每小时包含 12 个采样点,则每小时平均为

对 7 天同一小时的值求平均即可得到典型日小时负荷曲线

15 分钟级的典型日构造方式类似:先将每三个 5 分钟采样点合并为一个 15 分钟点,再按一天 96 个 15 分钟时段重构并跨日平均。

三种时间尺度的潜力计算

以下部分按设备维度进行循环处理。

1. 日前层次(小时级)

对于第 𝑖台设备,首先取出对应列的历史功率序列,并读取额定功率和实时功率:

1
2
3
4
5
6
7
8
P_upList, P_downList = [], []
P_up_rList, P_down_rList = [], []
P_up_sList, P_down_sList = []

for i in range(col_num):
P = file[:, i].astype(float)
P_n = float(P_eding[i])
P_d_real = float(P_shishi[i])

将 5 分钟数据按小时聚合,若长度不足 12 的整数倍,则在末尾补零:

1
2
3
4
5
6
if len(P) % 12 != 0:
pad_size = 12 - (len(P) % 12)
P = np.pad(P, (0, pad_size), mode='constant', constant_values=0)

P_h = np.sum(P.reshape(12, -1), axis=0) / 12.0
P_d = np.sum(P_h.reshape(24, -1), axis=1) / 7.0

此处 P_d 即对应前述典型日小时负荷曲线。随后得到日前上调与下调潜力:

1
2
P_up = P_n - P_d
P_down = P_d

并在后续进行非负截断与存储。

2. 日内层次(15 分钟级)

日内层次采用 15 分钟时间步长,仍然基于历史 7 天数据进行统计。首先按 15 分钟聚合:

1
2
3
4
5
6
if len(P) % 3 != 0:
pad_size = 3 - (len(P) % 3)
P = np.pad(P, (0, pad_size), mode='constant', constant_values=0)

P_h_r = np.sum(P.reshape(3, -1), axis=0) / 3.0
P_d_r_full = np.sum(P_h_r.reshape(96, -1), axis=1) / 7.0

这里 P_d_r_full 是一天 96 个 15 分钟点的典型日曲线。接下来根据当前时间索引 t,截取未来窗口,例如长度为 15 的时间段,用于表示约 4 小时内的期望负荷水平:

1
2
3
4
if t <= 81:
P_d_r = P_d_r_full[t:t + 15]
else:
P_d_r = np.concatenate((P_d_r_full[t:96], P_d_r_full[0:t - 81]))

由此获得日内上调和下调潜力:

1
2
P_up_r = P_n - P_d_r
P_down_r = P_d_r

日内结果体现的是在当前时刻之后若干个 15 分钟时段内,每一台设备可提供的调节能力。

3. 实时层次(5 分钟级)

实时层次的计算最为直接,以当前实时功率 𝑃_𝑑_real​ 为基准:

1
2
P_up_s = P_n - P_d_real
P_down_s = P_d_real

其中 P_up_s 为瞬时上调潜力,P_down_s 为瞬时下调潜力。二者反映的是在当前一个采样周期内,可以立刻执行的调节空间。

  1. 非负截断与结果整理
    在完成三个时间尺度的计算后,统一进行非负截断并将结果写入列表,最终转为数组形式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    P_upList.append(np.maximum(P_up, 0))
P_downList.append(np.maximum(P_down, 0))

P_up_rList.append(np.maximum(P_up_r, 0))
P_down_rList.append(np.maximum(P_down_r, 0))

P_up_sList.append(max(P_up_s, 0))
P_down_sList.append(max(P_down_s, 0))

P_upList = np.array(P_upList)
P_downList = np.array(P_downList)

P_up_rList = np.array(P_up_rList)
P_down_rList = np.array(P_down_rList)

P_up_sList = np.array(P_up_sList)
P_down_sList = np.array(P_down_sList)

至此,三种时间尺度上的可调节能力已按设备与时间索引进行结构化存储,为后续收益计算提供基础。

收益计算模型

在获得可调节能力之后,需要结合补贴价格和响应策略,将功率响应转换为经济收益。设在某一时间尺度下,采用上调或下调方向的选择由标志位 $x$ 决定:当 $x=1$ 时使用上调潜力、$x=2$ 时使用下调潜力。

以日前层次为例,记方向标志为 $x_1$,定义系数

根据选定的方向,可以使用 和 选取对应的功率:

考虑补贴单价之后,日前收益表达为

日内层次同理,在标志位 $x_2$ 下计算

实时层次仅涉及当前采样点,在 $x_3$ 方向下为

通过上述三种时间尺度的计算,可以得到分别对应日前、日内、实时的需求响应收益 $C$、$C_r$、$C_s$,其单位与补贴价格和功率一致,适合用于成本效益分析或补贴策略评估。

工程与研究意义

该实现本质上构建了一个从历史与实时数据到“可调节能力基线”和“经济收益估算”的桥梁,在工程应用和研究工作中具有以下几点意义。

第一,可调节能力基线是后续调度优化的前提。许多虚拟电厂和需求响应模型在构建优化问题时,将可调节负荷作为决策变量,但如果缺乏对实际可调节范围的稳健估计,优化结果很难落地。通过基于历史负荷构造典型日曲线,并在额定功率约束下计算上调和下调潜力,可以较为直观地给出每台设备在不同时段的理论可调节上限,为后续模型设定合理的功率边界。

第二,通过时间聚合和跨日平均,将原本“堆叠式”的 5 分钟数据转换为具有明显日内结构的典型日视图,可以显著提升数据可解释性。设备在一天中负荷水平的变化规律、某些时间段可调节空间较大的特征,都可以直接从典型日曲线及其对应的潜力分布中观察得到,这对于负荷聚类、可调节资源分级管理等问题具有参考价值。

第三,多时间尺度视角有助于与实际调度流程对接。日前层次强调对次日整体调节能力的评估,日内层次更加关注未来数小时的滚动调整,而实时层次则反映当前瞬时的可执行能力。三者结合,可以支持从日前计划、日内修正到实时控制的一致性分析,也可以为不同时间尺度的补贴价格设计提供依据。

第四,收益计算模块将技术可行性与经济性联系起来。通过在不同时间尺度下引入上调和下调补贴单价,可以直接得到各类需求响应事件的收益估计。这不仅便于电网侧评估激励成本是否合理,也便于用户侧判断参与响应是否值得,对于政策制定、商业模式设计均有参考意义。

第五,该实现为进一步扩展提供了自然的接口。例如,可以在可调节能力计算中引入更复杂的约束,如最小启停时间、设备温度或舒适度约束、启停次数限制等;也可以将典型日构造由简单平均扩展为分类统计或基于天气、温度的条件平均;在收益模型上则可以引入分时电价、惩罚费用等,实现更精细的经济性分析。

结语

本文从实际数据处理与代码实现出发,构建了一套光伏场景下多时间尺度可调节负荷评估与需求响应收益计算的方法。基于历史 5 分钟采样数据构造典型日负荷曲线,在额定功率约束下分别计算日前、日内和实时的上调与下调潜力,并结合补贴价格矩阵和响应时间段,得到对应的经济收益。

该方法结构清晰,易于实现,适合嵌入园区能量管理系统、虚拟电厂平台或需求响应仿真环境中,也可以作为论文或项目中的基础模型模块。在此基础上,进一步叠加设备物理约束、预测模型和优化算法,即可构成较为完整的削峰填谷与需求响应方案。