第1章:ERA5数据获取——CDS API注册与配置
大家好,我是你们这堂课的老朋友。
做风电的朋友都知道,数据是咱们的命根子。没有高质量的风场数据,什么功率预测、风资源评估都是空中楼阁。ERA5这套再分析数据,我用了快五年了,说实话,它是我见过最靠谱的“免费午餐”。
今天咱们就聊聊怎么把这顿“午餐”端上桌。说白了,就是搞定CDS API的注册、配置,然后用Python把它下载下来。
1.1 CDS API注册——别嫌麻烦,这一步省不了
我第一次用ERA5的时候,也想着“能不能直接给个网盘链接?”结果折腾半天发现,官方这套API机制其实是为了保护数据服务稳定。你想想看,全球那么多人同时下载,没个认证怎么行?
注册流程其实很简单,就三步:
- 打开 CDS官网(Climate Data Store),点右上角“Login”
- 用邮箱注册账号,验证邮件记得去垃圾箱翻翻——我当初就卡在这步十分钟
- 登录后进入 “API Access” 页面,找到你的个人API Key
1.2 配置CDS API环境——让Python认识你的钥匙
拿到Key之后,咱们得让Python知道怎么用它。这里有两种方式,我个人推荐第二种。
方式一:手动创建配置文件
在你的用户目录下(Windows是 C:\Users\你的用户名\,Linux是 ~),新建一个文件叫 .cdsapirc。内容长这样:
url: https://cds.climate.copernicus.eu/api/v2
key: 你的UID:你的API Key
方式二:用Python自动配置(我常用的)
写个脚本,一劳永逸:
import os
# 设置环境变量(临时生效)
os.environ['CDSAPI_URL'] = 'https://cds.climate.copernicus.eu/api/v2'
os.environ['CDSAPI_KEY'] = '你的UID:你的API Key'
# 或者直接写入配置文件
with open(os.path.expanduser('~/.cdsapirc'), 'w') as f:
f.write('url: https://cds.climate.copernicus.eu/api/v2\n')
f.write('key: 你的UID:你的API Key\n')
1.3 Python调用CDS API——真正开始干活了
环境配好了,咱们来写第一段下载代码。先安装必要的库:
pip install cdsapi
然后,一个最基础的下载脚本长这样:
import cdsapi
c = cdsapi.Client()
c.retrieve(
'reanalysis-era5-single-levels',
{
'product_type': 'reanalysis',
'variable': '10m_u_component_of_wind',
'year': '2023',
'month': '01',
'day': ['01', '02', '03'],
'time': ['00:00', '06:00', '12:00', '18:00'],
'format': 'netcdf'
},
'era5_wind_202301.nc'
)
这段代码干了什么呢?说白了就是:告诉CDS服务器“我要2023年1月1日到3日,每天4个时次的10米风场U分量,打包成NetCDF发给我”。
嗯,这里要注意:第一次运行会有点慢,因为服务器要现场处理数据。我下载一个月的全球数据,通常要等5-10分钟。
1.4 数据参数选择——别什么都下载,硬盘会哭的
做风电,咱们最关心的变量其实就这几个:
| 变量名 | 含义 | 我的建议 |
|---|---|---|
| 10m_u_component_of_wind | 10米高度纬向风(东西方向) | 必选,算风速的基础 |
| 10m_v_component_of_wind | 10米高度经向风(南北方向) | 必选,和U一起算风速风向 |
| 100m_u_component_of_wind | 100米高度纬向风 | 强烈推荐,风机轮毂高度 |
| 100m_v_component_of_wind | 100米高度经向风 | 同上 |
| surface_pressure | 地表气压 | 可选,做空气密度修正用 |
时间和空间范围怎么选? 我的经验是:
- 时间:先下载一年试试水,别一上来就搞30年。我刚开始做项目时,贪心选了1980-2020年,结果硬盘爆了。
- 空间:用经纬度范围裁剪。比如你的风场在内蒙古,就别下载全中国的数据。代码里加个
'area': [45, 110, 40, 120]就行(北纬45°到40°,东经110°到120°)。
1.5 批量下载与断点续传——别让网络断了你的节奏
下载大文件最怕什么?断网!我去年下载欧洲十年的数据,下了80%突然断了,那个心情……
后来我学乖了,用 循环+异常处理 实现断点续传:
import cdsapi
import os
from time import sleep
c = cdsapi.Client()
years = ['2020', '2021', '2022']
months = ['01', '02', '03']
for year in years:
for month in months:
filename = f'era5_wind_{year}{month}.nc'
# 检查文件是否已存在
if os.path.exists(filename):
print(f'{filename} 已存在,跳过')
continue
# 带重试机制的下载
for attempt in range(3):
try:
c.retrieve(
'reanalysis-era5-single-levels',
{
'product_type': 'reanalysis',
'variable': ['10m_u_component_of_wind', '10m_v_component_of_wind'],
'year': year,
'month': month,
'day': [f'{d:02d}' for d in range(1, 32)],
'time': ['00:00', '06:00', '12:00', '18:00'],
'format': 'netcdf',
'area': [45, 110, 40, 120] # 裁剪区域
},
filename
)
print(f'{filename} 下载成功')
break # 成功就跳出重试循环
except Exception as e:
print(f'第{attempt+1}次尝试失败:{e}')
sleep(5) # 等5秒再重试
- 按月下载,每个文件几百MB,断了也不心疼
- 用
os.path.exists()检查文件,避免重复下载 - 重试3次,每次间隔5秒——CDS服务器偶尔会抽风
1.6 本章知识体系总览
说了这么多,咱们用一张图把整个流程串起来:
这张图把咱们今天讲的内容串起来了。从注册到下载,每一步都有坑,但每一步也都有解法。
好了,这一章的内容就到这儿。记住:数据是风电分析的基石,ERA5这套数据值得你花时间把它搞透。下一章咱们聊聊怎么把下载下来的NetCDF文件打开、查看、做初步的质量控制——那才是真正开始玩数据的时候。