第一章 气象数据获取与处理
各位同行,咱们做风电场气候可行性论证,第一步就是跟数据打交道。说白了,数据就是我们的“原材料”。数据不准,后面算发电量、选机位全是白搭。今天我就把气象数据这块的实战经验掰开揉碎了讲。
1.1 气象站数据:最传统的“老黄历”
气象站数据,大家都不陌生。国家气象局下属的基准站、基本站、一般站,全国有几千个。这些站观测历史长,有的能追溯到上世纪50年代。我个人习惯,做项目第一件事就是查项目周边50公里范围内有哪些气象站。
关键点:气象站数据最大的优势是“实测”,但坑也不少。
我在项目中遇到过这样的情况:某个气象站2015年迁站了,但数据里没标注。结果我拿前后数据做长序列分析,风向频率图直接变了样。嗯,这里要注意——气象站数据必须做“均一性检验”。
气象站数据通常包含以下要素:
- 风速(10分钟平均、最大、极大)
- 风向(16方位或360°)
- 温度、气压、湿度
- 降水量、日照时数
你想想看,这些数据里风速和风向是最关键的。但气象站的风速仪高度一般是10米,而我们风电场轮毂高度动辄80米、100米。所以必须做风速垂直外推。怎么推?我后面会讲。
避坑指南:我曾经拿一个气象站30年数据做风资源评估,结果发现该站2000-2005年期间仪器故障,数据全是插补的。所以拿到数据后,第一件事查“元数据”——仪器变更记录、迁站记录、缺测记录。
1.2 再分析数据:ERA5与MERRA-2
再分析数据,说白了就是“用模式算出来的历史数据”。它把卫星、探空、地面观测等资料同化进数值模式,生成全球格点数据。目前风电行业用得最多的是ERA5和MERRA-2。
| 对比项 | ERA5(ECMWF) | MERRA-2(NASA) |
|---|---|---|
| 空间分辨率 | 0.25°×0.25°(约31km) | 0.5°×0.625°(约50km) |
| 时间分辨率 | 1小时 | 1小时 |
| 时间跨度 | 1940年至今 | 1980年至今 |
| 垂直层数 | 137层 | 72层 |
| 风速变量 | 10m/u/v分量 | 10m/u/v分量 |
我个人更偏爱ERA5。为什么?分辨率更高,而且有100米高度的风速数据。但要注意,再分析数据是“模式输出”,不是实测。我见过有人直接拿ERA5的100米风速当测风塔数据用,结果偏差20%以上。
实战技巧:再分析数据适合做“长序列订正”。比如你有1年测风塔数据,想订正到30年长序列。那就用ERA5提取对应格点的30年数据,建立测风塔与ERA5的回归关系。我习惯用分风向扇区做线性回归,效果比整体回归好很多。
获取ERA5数据,我一般用Python的cdsapi库:
import cdsapi
c = cdsapi.Client()
c.retrieve(
'reanalysis-era5-single-levels',
{
'product_type': 'reanalysis',
'variable': ['10m_u_component_of_wind', '10m_v_component_of_wind'],
'year': ['2020', '2021', '2022'],
'month': ['01', '02', '03', '04', '05', '06',
'07', '08', '09', '10', '11', '12'],
'day': [f'{d:02d}' for d in range(1, 32)],
'time': [f'{h:02d}:00' for h in range(0, 24)],
'area': [40, 110, 30, 120], # 北纬40-30,东经110-120
'format': 'netcdf'
},
'era5_wind_2020_2022.nc'
)
这段代码下载指定区域3年的10米风场数据。下载后记得算合成风速:ws = sqrt(u² + v²)。嗯,这里要注意,ERA5的u/v分量是气象学定义,跟工程上用的正北坐标系可能差一个角度。
1.3 测风塔数据:我们的“金标准”
测风塔数据,是风电场资源评估的基石。我常说,没有测风塔数据,风资源评估就是“盲人摸象”。测风塔一般安装10m、30m、50m、70m、80m、100m等多层风速仪和风向标。
测风塔数据的特点:
- 精度高:直接测量,误差小
- 时间短:通常只有1-3年
- 代表性强:只代表塔位周边几公里
- 成本高:一座塔几十万,还得维护
我在项目中遇到过测风塔被雷劈的情况。那年夏天,内蒙古一个项目,测风塔遭雷击,风速仪直接报废。等我们发现时,已经缺了两个月数据。所以我现在做项目,一定要求业主装备份风速仪,而且不同高度交叉备份。
核心原则:测风塔数据必须经过严格质量控制,才能用于后续分析。
1.4 数据质量控制:别让垃圾数据害了你
数据质量控制,说白了就是“去伪存真”。我见过太多项目,拿着没清洗的数据直接算发电量,结果偏差30%以上。质量控制分三步走:
- 合理性检查:风速0-40m/s,风向0-360°,温度-40~50℃。超出范围直接标记为无效。
- 时间一致性检查:相邻10分钟风速变化超过10m/s,或者风向突变超过90°,大概率是仪器故障。
- 空间一致性检查:同一测风塔不同高度,风速应该随高度增加而增大。如果80m风速比50m还小,那肯定有问题。
我曾经遇到一个项目,测风塔70m和80m风速曲线几乎重合。查了半天,发现是安装工人把两个风速仪的线接反了。所以数据质量控制不只是算法问题,还得结合现场情况判断。
警告:不要用自动化程序直接清洗数据。我习惯先画散点图、时序图,肉眼过一遍。机器能发现“异常值”,但发现不了“合理但错误”的数据。
1.5 数据插补:把缺失的数据“补回来”
数据插补,是风资源评估的必修课。测风塔数据总有缺测的时候——仪器故障、结冰、雷击、人为破坏。缺测率超过10%,这个测风塔的数据质量就要打问号了。
常用的插补方法:
- 线性插值:适用于短时间缺测(<2小时)
- 相关关系法:用相邻高度或相邻测风塔建立回归方程
- 再分析数据插补:用ERA5/MERRA-2数据填补长时段缺测
- MCP法:Measure-Correlate-Predict,用长期参考站订正短期测风数据
我个人最常用的是MCP法。原理很简单:找到项目附近一个长期气象站(>10年数据),建立测风塔与气象站同期数据的回归关系,然后用这个关系把测风塔数据“延长”到长期序列。
MCP法的Python实现示例:
import numpy as np
from sklearn.linear_model import LinearRegression
# 假设 mast_data 是测风塔数据,ref_data 是参考站数据
# 按风向扇区分别建立回归模型
sectors = [0, 22.5, 45, 67.5, 90, 112.5, 135, 157.5,
180, 202.5, 225, 247.5, 270, 292.5, 315, 337.5]
models = {}
for i in range(16):
# 提取该扇区内的数据
mask = (mast_wdir >= sectors[i]) & (mast_wdir < sectors[i] + 22.5)
if np.sum(mask) < 10:
continue
X = ref_data[mask].reshape(-1, 1)
y = mast_data[mask]
model = LinearRegression()
model.fit(X, y)
models[sectors[i]] = model
# 用模型插补缺失数据
for i in range(len(mast_data)):
if np.isnan(mast_data[i]):
sector = int(mast_wdir[i] // 22.5) * 22.5
if sector in models:
mast_data[i] = models[sector].predict([[ref_data[i]]])
这段代码按16个风向扇区分别建立线性回归模型。为什么分扇区?因为不同风向的气流路径不同,风速相关性也不同。我试过整体回归,误差比分扇区大15%左右。
小技巧:插补完成后,一定要做“回代检验”。把已知数据假装成缺失,用插补方法算一遍,看误差有多大。如果误差超过10%,说明插补方法不合适,得换。
知识体系总览
下面这张图,是我自己总结的气象数据获取与处理的知识体系。你把它打印出来贴在工位上,做项目时对照着看,基本不会漏掉关键步骤。
这张图把整个流程串起来了。从数据来源到最终输出,每一步都不能跳过。我见过有人为了省事,直接拿ERA5数据当测风塔用,结果项目融资时被银行质疑,最后补了一年测风才过关。
好了,气象数据获取与处理这块,核心就是这些。记住一句话:数据质量决定分析质量,分析质量决定项目成败。下一章咱们聊风资源评估的具体方法,到时候见。
公众号:蓝海资料掘金营,微信deep3321