3. NWP数据获取:ECMWF、GFS、CMA等主流预报源的特点与接口

各位同行,今天咱们聊聊NWP数据获取这件事。说白了,就是去哪里拿天气预报数据,以及这些数据各自有什么脾气。

我在风电预测这行干了快十年,跟ECMWF、GFS、CMA这几个老伙计打了无数交道。每个数据源都有自己的性格,摸透了它们,你的预测模型才能跑得稳。

3.1 三大主流预报源概览

先给个全景图。目前风电行业用得最多的,就是欧洲中心的ECMWF、美国国家的GFS,还有咱们中国的CMA。这三家各有千秋。

核心观点:没有绝对最好的数据源,只有最适合你场景的数据源。

我个人习惯是,做短期预测(0-72小时)用ECMWF,做中长期参考(7-15天)用GFS,而CMA的数据,在国内项目上我基本都会搭配使用。

主流NWP数据源对比框架 ECMWF 欧洲中期天气预报中心 GFS 全球预报系统(美国) CMA 中国气象局 ✓ 精度最高 ✓ 时间分辨率6h ✗ 获取成本高 ✓ 免费开放 ✓ 时间分辨率3h ✗ 精度略低 ✓ 中国区域最优 ✓ 空间分辨率高 ✗ 接口限制多 推荐使用场景 短期功率预测(0-72h) 中长期趋势预测(7-15d) 中国区域并网预测 最佳实践:多源融合,取长补短 ECMWF做基准 + GFS做补充 + CMA做本地化修正

3.2 ECMWF:精度之王,但门槛不低

ECMWF的数据,圈内公认的精度最高。为什么?它的同化系统做得最好,模式分辨率也高。我记得有一次做海上风电项目,用ECMWF的10米风速预报,跟实测的相关系数能到0.85以上,GFS大概在0.78左右。

但ECMWF有个问题——贵。它的商业授权费用不低,而且数据获取流程比较繁琐。如果你是小团队,可能得掂量掂量。

我的经验:ECMWF的HRES(高分辨率预报)和ENS(集合预报)要搭配使用。HRES看确定性,ENS看概率分布,两者结合能更好地评估预报不确定性。

接口方面,ECMWF主要通过ECMWF Web API或者MARS语言来获取。我一般用Python的ecmwf-api-client库来拉数据。

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': '2024',
        'month': '01',
        'day': ['01', '02', '03'],
        'time': ['00:00', '06:00', '12:00', '18:00'],
        'area': [40, 110, 30, 120],  # 北纬40到30,东经110到120
        'format': 'netcdf'
    },
    'era5_wind_data.nc'
)

嗯,这里要注意,ECMWF的API有请求频率限制。我曾经一次性拉太多数据,直接被封了IP,等了半天才解封。建议每次请求不要超过一个月的量。

3.3 GFS:免费大碗,但精度有取舍

GFS最大的优势就是免费。你想想看,全球覆盖、每天更新4次、预报时长16天,全部免费开放。这对预算有限的团队来说,简直是福音。

但免费是有代价的。GFS的空间分辨率大概是0.25度,约合28公里。对于地形复杂的风电场,这个分辨率可能不够用。我在云南一个山地风场做过对比,GFS预报的风速跟实测偏差能达到2-3m/s,而ECMWF大概在1-1.5m/s。

避坑指南:我曾经直接用GFS的原始格点数据做预测,结果模型效果很差。后来发现,GFS在复杂地形区域的预报偏差有系统性特征,必须做偏差订正。建议用历史数据训练一个MOS(模式输出统计)模型来修正。

GFS的数据获取方式很多。我常用的是NOMADS服务器,或者通过NOAA的OpenDAP接口直接读取。

import xarray as xr
import pandas as pd

# 通过OpenDAP直接读取GFS数据
url = 'https://nomads.ncep.noaa.gov/dods/gfs_0p25_1hr/gfs20240101/gfs_0p25_1hr_00z'

ds = xr.open_dataset(url)

# 提取风电场位置的数据
lat, lon = 35.5, 115.2  # 假设风电场坐标
wind_u = ds['ugrd10m'].sel(lat=lat, lon=lon, method='nearest')
wind_v = ds['vgrd10m'].sel(lat=lat, lon=lon, method='nearest')

# 计算风速
wind_speed = (wind_u**2 + wind_v**2)**0.5
print(wind_speed)

GFS的时间分辨率是3小时,但最近推出了1小时输出的子集。如果你做的是超短期预测(0-4小时),建议用这个1小时的数据,效果会好很多。

3.4 CMA:中国区域的本地化优势

CMA的数据,说白了就是咱们中国气象局的预报产品。它的全球模式GRAPES,在中国区域的预报精度其实不输ECMWF。特别是对于台风、强对流这些极端天气,CMA的本地化参数化方案做得更到位。

我参与过一个沿海风电项目,台风季的时候,ECMWF和GFS都报偏了,只有CMA的路径预报最准。从那以后,我养成了一个习惯:国内项目必配CMA数据。

CMA的数据接口相对封闭一些。主要通过天擎(CMADaaS)平台获取,需要申请账号和权限。不过好消息是,现在CMA也开放了部分免费数据接口。

数据源 空间分辨率 时间分辨率 预报时长 更新频率 获取成本
ECMWF HRES 0.1° (~9km) 1h / 3h / 6h 10天 / 15天 每天2次 高(商业授权)
ECMWF ENS 0.2° (~18km) 6h 15天 每天2次
GFS 0.25° (~28km) 3h / 1h 16天 每天4次 免费
CMA GRAPES 0.25° (~28km) 3h / 6h 10天 每天4次 部分免费

3.5 多源融合的实战策略

讲完了各自的特点,咱们聊聊怎么用。我个人习惯的做法是:

  1. 基准模型用ECMWF:它的精度最高,作为主预报源
  2. GFS做补充和校验:当ECMWF数据延迟或者缺失时,用GFS顶上
  3. CMA做本地化修正:特别是中国区域,用CMA的预报来修正ECMWF的系统性偏差

核心技巧:不要简单地对多个数据源取平均。更好的做法是,用历史数据训练一个权重模型,让模型自己学习每个数据源在不同天气条件下的表现优劣。

举个例子,我做过一个实验:在华北平原的风电场,ECMWF在冬季的预报偏差比GFS小30%,但在夏季雷暴天气下,CMA的预报反而更准。所以,动态权重比固定权重效果好得多。

最后说一句,数据获取只是第一步。拿到数据后,怎么处理、怎么插值、怎么跟实测数据对齐,这些才是真正考验功力的地方。下一章咱们就聊聊数据预处理那些坑。

我的建议:刚开始做多源融合时,别贪多。先选两个数据源(比如ECMWF+GFS),跑通流程,再逐步加入第三个。一口吃不成胖子,数据源多了反而容易出问题。

专注资料整理