第1章:ERA5数据获取——CDS API注册与配置

大家好,我是你们这堂课的老朋友。

做风电的朋友都知道,数据是咱们的命根子。没有高质量的风场数据,什么功率预测、风资源评估都是空中楼阁。ERA5这套再分析数据,我用了快五年了,说实话,它是我见过最靠谱的“免费午餐”。

今天咱们就聊聊怎么把这顿“午餐”端上桌。说白了,就是搞定CDS API的注册、配置,然后用Python把它下载下来。

1.1 CDS API注册——别嫌麻烦,这一步省不了

我第一次用ERA5的时候,也想着“能不能直接给个网盘链接?”结果折腾半天发现,官方这套API机制其实是为了保护数据服务稳定。你想想看,全球那么多人同时下载,没个认证怎么行?

注册流程其实很简单,就三步:

  1. 打开 CDS官网(Climate Data Store),点右上角“Login”
  2. 用邮箱注册账号,验证邮件记得去垃圾箱翻翻——我当初就卡在这步十分钟
  3. 登录后进入 “API Access” 页面,找到你的个人API Key
💡 我的小习惯:注册完第一时间把API Key复制到记事本里。别问我为什么强调这个——我曾经重装系统后找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')
⚠️ 注意:API Key相当于你的密码。千万别把它硬编码在公开的代码里!我见过有人把Key传到GitHub上,结果第二天账号就被限制了。

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数据获取全流程 1. CDS注册 获取API Key 2. 环境配置 .cdsapirc文件 3. 参数选择 变量/时间/空间 4. 批量下载 断点续传+重试 关键参数速查 • variable: 10m_u/v, 100m_u/v, surface_pressure • area: [北纬, 西经, 南纬, 东经] 格式 • format: netcdf(推荐)或 grib

这张图把咱们今天讲的内容串起来了。从注册到下载,每一步都有坑,但每一步也都有解法。

好了,这一章的内容就到这儿。记住:数据是风电分析的基石,ERA5这套数据值得你花时间把它搞透。下一章咱们聊聊怎么把下载下来的NetCDF文件打开、查看、做初步的质量控制——那才是真正开始玩数据的时候。


专注资料整理