第二章:数据基础——SCADA、测风塔、气象与电网调度数据的获取与清洗
各位同行,大家好。欢迎来到实战课程的第二讲。
做风电后评估,说白了就是跟数据打交道。你想想看,如果数据本身都是脏的、乱的、缺的,那后面算出来的发电量、效率指标,能信吗?
我个人习惯,拿到一个风电场项目,第一件事不是急着算指标,而是先花至少一半的时间去梳理数据。嗯,这一步做扎实了,后面才能稳。
2.1 四大数据源,缺一不可
风电场后评估,我们主要依赖四类数据。我管它们叫“四驾马车”,少一个都不行。
| 数据源 | 核心作用 | 常见格式 |
|---|---|---|
| SCADA数据 | 单机运行状态、发电量、故障记录 | .csv, .xlsx, 数据库 |
| 测风塔数据 | 风资源代表值、切变、湍流 | .csv, .txt, .dat |
| 气象数据 | 长期订正、极端天气分析 | .nc, .grib, .csv |
| 电网调度数据 | 限电、停机、考核 | .xlsx, .pdf, 调度系统导出 |
我在项目中遇到过,有的同事只盯着SCADA数据,忽略了测风塔的异常,结果算出来的发电量偏差很大。后来一查,是测风塔的超声波风速计被冻住了,数据全是0。所以,四类数据必须交叉验证。
2.2 SCADA数据:最核心,也最头疼
SCADA数据是风机的“黑匣子”。它记录了每一台风机每10分钟的平均值、最大值、最小值、状态码。
获取方式:
- 直接从风电场中控室导出
- 通过OPC接口实时采集
- 从风机厂家远程平台下载
清洗要点:
- 时间戳对齐:不同风机的时间可能不同步,我习惯统一转为UTC+8,再按整10分钟对齐。
- 状态码过滤:停机、限电、故障、维护等状态要打标签。千万别把停机时的0功率当成正常数据。
- 异常值剔除:比如风速超过切出风速但功率不为0,或者功率为负值(风机在耗电)。
核心原则:SCADA数据清洗,不是删得越多越好。要保留“真实”的异常,比如电网波动导致的功率骤降,那是分析限电损失的重要依据。
2.3 测风塔数据:风资源的“标尺”
测风塔是风电场最贵的传感器。它的数据质量,直接决定了风资源评估的准确性。
获取方式:
- 现场数据采集器下载(Campbell, NRG等)
- 远程传输(GPRS/卫星)
清洗要点:
- 扇区剔除:塔影效应、叶片遮挡会导致某些风向的数据失真。我一般会剔除塔影区(±30°)的数据。
- 垂直切变检查:不同高度的风速比应该在合理范围内。如果80m风速比50m还低,那大概率是传感器故障。
- 结冰处理:北方风电场冬季常见。当温度低于0℃且湿度大于90%时,风速数据可能冻结。我曾经处理过一个项目,整个冬季的测风塔数据都是平的,后来加了加热传感器才解决。
小技巧:测风塔数据建议保留原始10分钟数据,不要轻易平均成小时数据。因为风资源的波动性,10分钟数据能捕捉到更多细节。
2.4 气象数据:长期趋势的“校正器”
气象数据主要用于长期订正。因为测风塔只有1-3年的数据,而风电场要运行20年,我们需要用气象站的长序列数据来修正。
获取方式:
- ERA5再分析数据(免费,全球覆盖)
- MERRA-2数据
- 当地气象站实测数据
清洗要点:
- 空间匹配:气象网格点(比如ERA5是0.25°×0.25°)与风电场位置的距离,最好在50km以内。
- 时间匹配:气象数据通常是小时级,需要插值到10分钟,或者直接按小时聚合。
- 异常值处理:比如ERA5的10m风速偶尔会出现负值,直接剔除即可。
注意:气象数据只能用于趋势分析,不能直接用于功率曲线验证。因为气象网格的风速与风机轮毂处的风速,差异可能很大。
2.5 电网调度数据:限电分析的“铁证”
电网调度数据是分析限电损失的关键。没有它,你算出来的发电量可能比实际高很多。
获取方式:
- 调度中心下发的限电指令(PDF或Excel)
- 风电场AGC系统记录
- 电网考核系统导出
清洗要点:
- 时间对齐:调度指令的时间精度通常是15分钟或1小时,需要与SCADA的10分钟数据对齐。
- 限电类型区分:是全场限电,还是单机限电?是计划性限电,还是故障性限电?
- 数据补全:有时候调度数据缺失,我会用SCADA的功率与理论功率的差值来反推限电量。
2.6 数据清洗实战流程
好了,理论讲完了。咱们来点实际的。下面是我常用的数据清洗流程,用Python实现。
import pandas as pd
import numpy as np
# 读取SCADA数据
df = pd.read_csv('scada_10min.csv', parse_dates=['time'])
# 1. 时间戳对齐
df.set_index('time', inplace=True)
df = df.resample('10T').mean() # 重采样到10分钟
# 2. 状态码过滤
valid_status = [1, 2, 3] # 正常运行、发电、待机
df = df[df['status'].isin(valid_status)]
# 3. 异常值剔除
# 风速在0-30m/s之间,功率在0-额定功率之间
df = df[(df['windspeed'] >= 0) & (df['windspeed'] <= 30)]
df = df[(df['power'] >= 0) & (df['power'] <= 2000)] # 假设额定功率2000kW
# 4. 缺失值处理
# 连续缺失不超过2个点,用线性插值
df = df.interpolate(method='linear', limit=2)
# 5. 保存清洗后的数据
df.to_csv('scada_cleaned.csv')
这段代码看起来简单,但实际项目中,你可能会遇到各种奇葩情况。比如,有的风机时间戳是字符串格式,有的功率单位是kW有的是MW,有的风速传感器坏了输出全是0。嗯,这些都需要你手动去排查。
2.7 数据质量评估指标
数据清洗完了,怎么判断质量好不好?我一般用这几个指标:
| 指标 | 计算公式 | 合格标准 |
|---|---|---|
| 数据完整率 | 有效数据点数 / 理论数据点数 | > 95% |
| 数据有效率 | 剔除异常后的数据点数 / 原始数据点数 | > 90% |
| 时间同步率 | 时间戳对齐的数据点数 / 总数据点数 | > 98% |
如果完整率低于80%,我建议你直接找现场运维要原始数据,或者检查数据采集系统是不是出了问题。
2.8 本章知识体系
下面这张图,是我自己总结的数据清洗逻辑框架。你一看就明白了。
这张图把整个流程串起来了。从四大数据源出发,经过四个清洗步骤,最终得到高质量数据集。每一步都有对应的质量指标来把关。
好了,这一章的内容就到这里。数据清洗是后评估的基石,你花多少功夫在上面,后面的分析结果就有多可靠。下一章,我们会进入功率曲线分析,那才是真正考验技术的地方。