信息速览
ERA5 是当今气象机器学习用得最多的一张「背景底图」:任何一个想知道某地某小时风多大、雨多少、云多厚的项目,几乎都会先从这里拉一份。它的分量不在精度,而在于把 1940 年以来的大气状态做成了全球、逐小时、口径一致的一套场。
真正让它在 AI 圈立住脚的是另一点:它同时是「预报模型的输入」和「预报模型的答案」。训练一个数据驱动的天气模型,输入的历史天气与要预测的未来天气都来自同一套同化系统,这是它被大规模使用的原因,也是大量论文结果无法外推的原因。
这份条目只讲单层产品——近地面、海面、陆面那些量,不包括气压层上的高空场。一屏速览见下表。
| 项目 | 数值 | 来源 |
|---|---|---|
| 官方全名 | ERA5 hourly data on single levels from 1940 to present | CDS 数据集页标题 |
| 制作方 | ECMWF,为 Copernicus C3S 制作,经 CDS 分发 | 目录 API providers / keywords |
| 时间覆盖 | 1940 年至昨日,逐小时 | 数据集页 Data description |
| 时间起点 | 1940-01-01 | 目录 extent.temporal |
| 再分析分辨率 | 0.25°×0.25°(大气) | 数据集页 Horizontal resolution |
| 集合统计量分辨率 | 0.5°×0.5°(大气),海浪 1° | 同上 |
| 海浪场分辨率 | 0.5°×0.5° | 同上 |
| 变量名数(去重) | 262 | 检索进程 inputs.variable 枚举 |
| 检索表单分组 | 15 组,含 Popular 汇总组 | 检索表单 JSON |
| 交付格式 | GRIB(主)、NetCDF(另选) | 数据集页 File format / 表单 |
| 更新频率 | 每日,延迟约 5 天 | 数据集页概述 |
| 许可 | CC BY 4.0 | 目录 API license 字段 |
| DOI | 10.24381/cds.adbb2d47 | 目录 API sci:doi |
| 访问门槛 | 需 CDS 账号并接受条款 | 客观事实,页内外均可验证 |
§1 速览:它是什么,也不是什么
§1.1 一句话定义
ERA5 把全球的观测资料(地面站、探空、飞机、船舶、浮标、卫星辐射率……)和一套数值天气预报模式的短时预报,按「数据同化」的方式不断融合,得到一份覆盖 1940 年至今、时间连续的全球大气状态记录。单层版本就是这份记录里贴近地面和海洋表面的那些量:2 米气温、10 米风、海平面气压、降水、云量、辐射收支、土壤温湿度、海浪要素。
它不是一份「观测数据集」。观测是离散的、有洞的、仪器换代过的;ERA5 是把这些观测塞进一个物理上自洽的四维场里,所以每一格每小时都有一个数——包括没有任何仪器观测过的地方。
§1.2 为什么它不是「又一个气象 CSV」
第一层原因是同化这个词的分量。ERA5 的每一个格点值都不是直接从仪器读数来的,而是「模式背景场 + 观测」解出来的分析场。官方在概述里把机制讲得很清楚:每 12 小时,把上一次预报和新到的观测按最优方式结合,得到新的最好估计,再从它发出新的预报;再分析把同一流程用在过去,但降低分辨率以覆盖几十年。
第二层原因是它被同时当作题目和答案。做逐小时的气象要素预测,输入的历史场与未来的验证场往往都来自 ERA5。这一点在 §4 里会展开,因为它是这份数据在 AI 使用中最常见的隐性缺陷。
第三层原因是分层。同一套 ERA5 在 CDS 上拆成了多个集合:高压层与单层、逐小时与月平均、原生分辨率与降采样版。单层只是其中一个格子。搞混了这几个集合,是会白白耗掉几天时间的。
§1.3 三十秒决策卡:你的处境,它能帮你什么
| 你的处境 | 它能帮你什么 |
|---|---|
| 要训练一个数据驱动的天气预报/临近预报模型 | 1940 年至今逐小时、全球一致的场,输入与验证都可取自同一套,缺失少、时间轴连续 |
| 要给其它数据(地面站、遥感瓦片、健康统计)配一份环境协变量 | 2 米气温、10 米风、降水、湿度、辐射都在同一时空网格上,按经纬度与时刻直接连接 |
| 要做风能、光伏的资源评估或功率预测 | 100 米风、地面短波辐射、云量、2 米气温都在单层产品里,且历史跨度长 |
| 要分析长期气候趋势 | 能用,但必须说清楚前四十年与后段的性质差别,见 §4 与 §7 |
| 要做海洋工程或波浪的后报 | 有效波高、平均波向、平均波周期都在单层产品里,分辨率比大气粗一档 |
| 要研究局部尺度(城市街区、山谷)的天气 | 给不了,0.25° 在赤道约 28 公里,见下一节 |
§1.4 不适合谁
如果需求是局地尺度的天气,ERA5 的 0.25° 网格在赤道附近约 28 公里一格,在 40°N 约 21 公里。城市热岛、山谷风、单条山谷的降水落区,这些尺度它分辨不出来。局地研究要用区域再分析、降尺度产品或高分辨率数值模拟,ERA5 更适合做边界条件。
如果需求是某一测站的仪器读数,ERA5 也不能替代。它是格点上的模式分析场,格心值与测站读数之间存在代表性误差,海拔、地表类型、下垫面差异都会造成偏差。要真值,要去找站点观测数据集。
如果需求是原生分辨率的完整 ERA5,单层集合给不了。CDS 页面明确写着这里是「regridded subset」,即降采样重网格后的子集;原生分辨率需要在别处按另一套流程取用,且门槛与流程都不同。
如果需求是未来预报,它更给不了。ERA5 是历史再分析,最新的数据也滞后约 5 天,它是「昨日的天气是什么」,不是「明天的天气会怎样」。
§2 数据构成:四个维度、262 个名字与一张约束表
§2.1 全量规模:哪些数字是官方的,哪些是数出来的
先把口径摆清楚。数据集页上的官方数字只有一组:1940 年至今、逐小时、全球、再分析 0.25°、集合统计量 0.5°、海浪 0.5°、格式 GRIB、日更。
其余数字来自机器可读的元数据,属于「从接口读出来的确定值」,不是估算。
| 维度 | 数值 | 出处在哪 | 性质 |
|---|---|---|---|
| 时间起点 | 1940-01-01 | 目录 extent.temporal | 官方 |
| 目录中时间终点 | 2026-10-23 | 目录 extent.temporal | 官方(随更新滚动) |
| 年份可选数 | 87 | 检索表单 year 枚举,1940–2026 | 接口 |
| 每小时可选时次 | 24 | 检索表单 time 枚举 | 官方 |
| 再分析纬度格数 | 721 | 由 0.25° 与 -90 至 90 的官方描述推得 | 推算,非官方表述 |
| 再分析经度格数 | 1440 | 同上,0 至 359.75 | 推算,非官方表述 |
| 变量名(去重) | 262 | 检索进程 inputs.variable 枚举 | 接口 |
| 检索表单分组数 | 15 | 检索表单 JSON(含 Popular 组) | 接口 |
| 各分组合计(含重复) | 279 | 同上 | 接口 |
| 空间包络 | 经 0–360,纬 -89–89 | 目录 extent.spatial.bbox | 官方 |
| 集合成员数 | 10 | 数据集页概述「10-member ensemble」 | 官方 |
| 集合抽样间隔 | 3 小时 | 同上 | 官方 |
| 更新延迟 | 约 5 天 | 同上 | 官方 |
| 早期版修订窗 | 2–3 个月 | 同上(ERA5T 段) | 官方 |
经度方向 360 度除以 0.25 得 1440,纬度方向 180 度除以 0.25 得 720 个区间、721 个格心——因为两端都算。表格里标注了「推算」,因为这组数字官方没有写在页面上,是拿来理解数据形状用的,不是引用来源。
§2.2 十五个分组:表单怎么组织变量
打开 CDS 的检索表单,变量被折叠成十五组。这不是科学分类,是表单可用性设计——把常用的放一组、把同类的放在一起。但它很能反映使用者的实际取用习惯。
| 分组 | 变量数 | 里面有什么(举例) |
|---|---|---|
| Popular(热门汇总) | 11 | 2 米气温、10 米风 u/v、海平面气压、总降水、海表温度、有效波高、平均波向、平均波周期、露点、地面气压 |
| Temperature and pressure | 12 | 2 米气温、2 米露点、海平面气压、地面气压、边界层高度、对流有效位能等 |
| Wind | 8 | 10 米与 100 米风分量、中性风分量、垂直速度等 |
| Mean rates | 39 | 各类通量的平均速率,量最大的一组 |
| Radiation and heat | 24 | 地面净短波/长波辐射、向下辐射、感热与潜热通量 |
| Clouds | 13 | 低云量、中云量、高云量、总云量、云底高度 |
| Lakes | 9 | 湖面温度、湖底温度、湖冰厚度、混合层深度与温度 |
| Evaporation and runoff | 5 | 蒸发、径流相关量 |
| Precipitation and rain | 11 | 总降水、大尺度降水、对流降水、各类型降水率 |
| Snow | 12 | 雪深、雪密度、雪反照率、各类型降雪 |
| Soil | 9 | 四层土壤温度、四层土壤湿度、土壤类型 |
| Vertical integrals | 37 | 各类垂直积分量 |
| Vegetation | 6 | 低/高植被覆盖、叶面积指数 |
| Ocean waves | 43 | 有效波高、总涌浪、风浪、波谱各阶矩、Stokes 漂移 |
| Other | 40 | 反照率、地形统计量、拖曳系数等 |
「Popular」组是把其它十四组里最常用的十一个变量提出来做快捷入口,所以它和其他组有重叠。262 是去掉这层重复后的真实变量名数量。
§2.3 一个真实的坑:同一个短名在两个组里
表单里变量用短名表示,比如 2m_temperature。短名全局唯一,这没问题。真正会卡住人的是长名与短名的对应。
文档里提到过一次改名:海浪产品的「10 米风」被改成了 ocean_surface_stress_equivalent_10m_neutral_wind_speed 这类长名,原因是海浪产品与大气产品的风变量发生了参数名冲突。旧代码里如果按数值参数号(param ID)取海浪风,改名后会取到大气风,数值看起来「差不多」,其实完全不是一回事。
这类事故的教训只有一条:变量按短名取,不按参数号取。短名在 CDS 的检索进程里有明确的枚举,是稳定契约。
§2.4 一条格点记录的逐项解剖
一条记录不是一个站点、不是一次过境,而是「某变量 × 某时刻 × 某经纬度格心」上的一个数。展开来看:
| 维度 | 取值形态 | 需要注意什么 |
|---|---|---|
| valid_time | 整点小时,如 2020-01-01 00:00 | 是分析场被定义的时刻,不是任何单一仪器的观测时间 |
| latitude | 0.25° 网格上的格心 | 指定 area 后网格会重切,格心列表随之变化 |
| longitude | 0.25° 网格上的格心 | 默认 0–359.75,指定 area 时按 -180–180 切 |
| variable | 262 个短名之一 | 同一时刻不同变量的物理语义不同,见 §4 |
| number | 0–9 | 只有 ensemble_members 有这一维 |
| 数值本身 | 定宽浮点 | 不同变量的量纲与累积语义不同,不能混算 |
这份解剖里最该记住的一点是最后一行:ERA5 不是一个「变量」表,而是一张「字段」表。同样叫「降水」,total_precipitation 是累积量,mean_total_precipitation_rate 是平均速率。单位差 3600 倍,直接换用会让模型学到完全错误的东西。
§2.5 与同类资源的定位差异
| 资源 | 覆盖时间 | 空间分辨率 | 时间分辨率 | 与 ERA5 单层的差别 |
|---|---|---|---|---|
| ERA5 单层(本篇对象) | 1940–今 | 0.25° | 逐小时 | 长历史、多要素、全连续 |
| ERA5 气压层 | 1940–今 | 0.25° | 逐小时 | 高空场,不含近地面专用量 |
| ERA5 原生分辨率 | 1940–今 | 更细 | 逐小时 | 需另走流程,数据量与门槛高 |
| ERA5 月平均 | 1940–今 | 0.25° | 月 | 预聚合,做长期统计更省事 |
| 格点化站点观测 | 视数据集而定 | 视数据集而定 | 逐日或小时 | 真值来源,但覆盖不连续 |
§3 定位层:先分清「哪个 ERA5」,再谈取数
§3.1 一个名字,五个集合
「ERA5」在 CDS 上不是一个条目,而是一个家族。仅同名相关的集合,目录里就有一长串:逐小时单层、逐小时气压层、月平均单层、月平均气压层、每日统计、时间序列、原生分辨率完整版、各类派生指数。它们的 ID 都长得很像,都叫 reanalysis-era5-*。
选错的代价不是「数据不对」,而是「维度和变量名对不上,白跑一遍」。气压层的变量名里带 level 这个维度,单层没有;月平均没有小时这一维。代码里写死一次,换集合就要改一次。
§3.2 「单层」到底指什么
单层不是指「只有一层」,而是指这些量不需要指定气压层。2 米气温指定的是离地 2 米这个高度,10 米风指定的是离地 10 米,海平面气压指定的是海平面。「单层」是个约定俗成的说法,意思是这一堆量的垂直坐标固定或本来就无垂直坐标。
对应的气压层产品才是「要指定层」的:500 hPa 的温度、850 hPa 的风。所以真正的区分轴不是「层数多少」,而是「取数时要不要填 level」。
§3.3 名字、序号与唯一指认
要在一篇论文或一个仓库里指明「我用的是哪份 ERA5」,最稳的写法是:
- 集合 ID:
reanalysis-era5-single-levels - 检索进程版本:当前
1.0.0 - 检索时间戳:你实际发起任务的时间
- DOI:
10.24381/cds.adbb2d47
只写「ERA5」是不够的,因为至少能指到五个不同的东西;只写「ERA5 逐小时」也不够,因为分不出单层与气压层。四件套齐全,别人才复现得了。
§3.4 版本与时间的错位
ERA5 的「版本」在这里有自己的含义。它不像软件那样有 1.0、1.1,也不像传统数据集那样按年份冻结一个快照。它的更新方式是滚动向前 + 回溯重算:最新的几天先以 ERA5T(早期版)发布,2–3 个月后若发现严重缺陷,会被终版替换。
这意味着同一个 URL、同一个集合 ID、同样的参数,两个月后再跑一次,拿到的文件可能不一样。这不是 bug,是设计。对策写在 §5 的复现性一节。
§3.5 什么时候该用气压层,什么时候该用单层
判断规则只有一条:要的量有没有垂直位置上的特定含义。
气温在 2 米处是单层(2m_temperature),在 500 hPa 上是气压层。风速在 10 米是单层,在 850 hPa 是气压层。海平面气压、降水、云量、辐射、土壤、海浪,这些都在单层产品里,因为它们的定义里不含「某一气压层」这个坐标。
反过来,任何需要指定层的量——温度、位势、湿度、风在某一气压面上的值——都只能去气压层产品。两者不能混,因为变量名与维度都不一样:气压层产品多一个 pressure_level 维,单层没有。
实际项目里常见的做法是两者混用:近地面的量取单层,高空环流取气压层。这时候必须把两个集合的取数记录分开存,因为它们的 DOI 与集合 ID 不同,写论文时是两个不同的数据来源。
§3.6 降采样意味着什么
CDS 页面有一句很短的说明:这里托管的是「regridded subset of the full ERA5 data set on native resolution」。这句话的分量比它看起来大。
原生分辨率的 ERA5 由 IFS 模式计算,水平格距比 0.25° 更细。CDS 提供的单层集合是把它重网格到规则经纬网、并把输出精度降低之后的版本。所以 0.25° 不是 ERA5 的物理分辨率,而是分发分辨率。
两者的差别在小尺度上最明显。模式原生网格上的细节,在从更细的格网插值到 0.25° 的过程中被平滑掉了。高频的信息(小尺度的梯度、锋面的锐利程度、局地环流)在分发版里会被削弱,低频信息(大尺度环流、季节循环、多年趋势)几乎无损。
对绝大多数机器学习任务,这个损失可以接受,因为模型本身也工作在 0.25° 或更粗的尺度上。对要用 ERA5 做降尺度研究的项目,这里是关键——他们需要原生分辨率作为训练目标,那就得走另一条取数路径。
这也解释了为什么相同的「ERA5」在不同论文里表现不一样:有的用原生分辨率,有的用 CDS 分发版,两者不是同一份东西,指标不可直接比较。
§4 质量层:这份数据最容易被误用的四个地方
§4.1 1940 到 1978:为什么官方愿意往回推四十年
ERA5 最初的正式覆盖从 1979 年开始,那是业务气象卫星时代真正的起点。往回推到 1940 是后来做的扩展,官方文档把它当作 ERA5 的一部分在维护,但性质上有明确区别。
道理不复杂:数据同化需要观测。1979 年后,极轨与静止卫星提供的辐射率、云导风、温湿廓线把观测覆盖到了全球海洋与高空;1979 年前,观测主要来自地面站、探空、船舶与飞机,海洋上空大片空白。同化系统在这些空白区只能更多依赖模式自己的短时预报,也就是背景场。
结果是:1940–1978 段的 ERA5 更「像模式」,1979 年后更「像观测」。两者都是 ERA5,但同质性不一样。
对做长期趋势的人,这不是可以忽略的细节。任何跨过 1979 的趋势、方差变化、极端事件频率统计,都要面对「观测系统在同一时间轴上换了一次代」这个事实。§7 会把这条单独列成局限。
§4.2 贯穿案例:某省级风电场出力回溯项目(本案例)
后面几节会反复回到同一个场景,这里先把它的来龙去脉交代清楚。
某省发展改革部门要做一份 1985 年至今的风电资源与出力回溯,用于新场址选址与既有场址的寿命评估。该项目组手上的历史资料只有两样:一座 2010 年建成的测风塔,一套 2015 年上线的场级出力计量。前者给出 70 米高度的逐十分钟风速与风向,后者给出全场每十五分钟的平均有功出力。1985 到 2010 年之间,既有场址的出力没有任何计量,新场址更是一片空白。
该项目组想用 ERA5 单层产品补上这段空白,具体是三步:第一步,用格点的 100 米风与 2 米气温补出 1985–2010 年的资源序列;第二步,用 2010 年后的塔测数据与同期的格点数据做一次统计校准,得到一个从格点到塔测的映射;第三步,把这个映射沿用到 1985–2010,再把校准后的风速通过功率曲线转成出力估计。
这个方案在思路上无可挑剔,在执行上会依次撞上四条坑。四条坑分别对应本节接下来的四小节:第一条是「要的量到底是什么」,第二条是「变量在时间上怎么定义」,第三条是「不确定度能不能借用」,第四条是「观测系统的变化怎么处理」。每一小节写完后都会回到这个项目,说明他们当时怎么撞上、怎么绕开。
第一条坑,也是最先撞上的:他们要的 100 米风速在 ERA5 里究竟属于什么性质的量。单层产品确实有 100m_u_component_of_wind 与 100m_v_component_of_wind,取数时填上就能拿到。但这两个量不是被直接同化进分析场的观测,而是从模式垂直廓线在 100 米处插值得到的三维风诊断量。同化系统直接约束的是模式的动量场与近地层参数化,100 米处的风是这套约束下游的产物。
这个区别在平坦地区不显眼,在复杂地形上会被放大。风电场轮毂高度普遍在 80 到 120 米之间,而 0.25° 格距在 40°N 附近约 21 公里,一个格子内部可能跨越两个山脊与一条河谷。格点上的 100 米风是对这整块地形的平均,测风塔测的是塔位那一点的风,两者在风向相同时可能相差两三成,在背风坡上甚至可以差一个量级。
该项目组最初的判断是「先把 100 米风拉下来,误差以后再修」,于是有了后面的校准步骤。这个顺序在工程上没问题,但它埋下了一个必须交代清楚的前提:校准函数是在一种地形条件下学到的,沿用到 1985 年时假设了地形与地表粗糙度没变。实际上那二十多年里,周边有过一轮林地恢复,粗糙度是变的。这个前提后来被写进了报告的风险章节。
§4.3 变量语义:瞬时、累积、平均,三套规则
单层产品里 262 个变量,按时间语义至少分三类。
| 类型 | 短名举例 | 语义 | 使用忌讳 |
|---|---|---|---|
| 瞬时量 | 2m_temperature、mean_sea_level_pressure |
该时刻的分析值 | 一般可以直接用;但求日均时要考虑时区与日内变化 |
| 累积量 | total_precipitation、各类积雪 |
自上一次后处理以来的累积 | 跨时刻相邻相减;绝对不能直接相加得到日总量以外的量 |
| 平均速率 | mean_total_precipitation_rate |
单位时间平均通量 | 与累积量相差一个时间因子,混用即错 |
最容易出事的组合是降水。有人拿 total_precipitation 做日总量,做法是把 24 个小时的值相加;也有人拿它做小时强度,做法是把某个小时的值直接当 mm/h。第二种做法错了 24 倍——那个值本身是「过去一小时累积」,不是速率。
§4.2 的案例里也有同类问题。辐射类变量里既有「累积的太阳辐射」,也有「平均的通量」,光伏出力建模如果把两者混着喂进模型,训练会收敛到一个奇怪的平均值上。
§4.4 降水与云量:格点上的平滑不是噪声
把 ERA5 的单格降水序列画出来,会看到它比站点观测「软」得多。真实降水的空间分布是斑块状的,ERA5 的 0.25° 场已经是对一个约几百平方公里格子的平均,极端值被摊薄,小雨被抹平。
这不是质量问题,是分辨率与目的决定的现象。它用来做气候统计、做区域水资源评估都合适;用来做「某个村今天有没有下雨」就不合适。同一条逻辑适用于云量(低/中/高云都在十余个变量里)、土壤湿度(四层土壤温度和湿度各有其代表深度)、积雪(雪深与雪密度是两回事)。
为什么会软,可以从三个层次理解,每一层都对应一个具体的使用后果。
第一层是格子的物理尺寸。一个 0.25° 的格子在中纬度大约二三十公里见方,面积在几百到一千平方公里。真实的对流性降水常常只落在一个格子的几分之一里,格内的平均必然把强的摊弱、把弱的抹平。所以单格降水的年最大值会系统性地低于格内某个测站的最大值,这与数据集好坏无关,是平均这个动作本身的性质。
第二层是参数化。模式里的降水不是解出来的,是参数化的产物:云微物理方案决定什么时候开始降水、降多少,对流参数化决定积云如何组织。参数化的目标是统计意义上的正确,不是单次事件的正确。ERA5 用的一套参数化在大尺度上校准得很好,在单个对流单体上就未必。
第三层是时间维度。逐小时的降水值本身是一个小时内的累积,而这个小时里模式输出的是多个时间步的累积量。时间上也有一个粗化。
三层叠起来,能得到一个有用的判断规则:用 ERA5 的降水做「区域和超过若干天」的统计是可靠的,做「单个格点单次极端事件」的判断是不可靠的。 前者对平滑不敏感,后者对平滑极度敏感。
§4.2 的案例里没有直接用到降水,但该项目组做的是一个类似的判断。他们要的是「年度平均风速」与「不同风向的频率分布」,两者都是长时段统计量,对逐小时的偏差不敏感。如果他们要做的是「某一天的极端阵风」,那么即使有塔测校准,ERA5 的 100 米风也不够用——它的时间分辨率是逐小时,极端阵风的时间尺度是分钟级。
§4.2 的案例里第三个撞点在这里:他们想用 ERA5 的 100 米风与 2 米气温推断机组效率,气温是好的,风在复杂地形上偏差大。该项目组最后的做法是用 2010 年后的塔测数据做一次逐小时的分位数映射,把 ERA5 的风速分布「扭」到塔测分布上,再把这个映射沿用到 1985–2010。这是个合理做法,但要写清楚:校准函数是在 2010 年后的观测系统下学到的,向前外推时假设了地形与地表没变。
§4.5 集合产品:不确定度不是误差条
ERA5 有 10 个成员的集合,3 小时间隔,大气 0.5°。官方另给了集合均值与离散度,方便直接用。
要理解它是什么:集合不是「10 次独立观测」,是 10 个扰动初值与模式参数下的 10 次同化/预报轨迹。离散度反映的是流依赖的不确定性——敏感的区域、敏感的时段,离散度大;资料多、形势稳定的地方,离散度小。
它不能当作「每个格点每小时的误差估计」。原因有二:其一,集合只有 3 小时间隔、0.5° 分辨率,和 0.25° 逐小时的分析场不在同一网格上,硬插值会引入额外偏差;其二,集合的构造目标是抽样不确定性,不是估计偏差。系统性偏差(比如山地气温偏高、海面风速偏大)不在离散度里体现。
§4.2 的案例里第四条坑正好落在这:该项目组想给回溯的风速序列配一条「不确定度带」,最初的方案是用集合离散度。试过一段就放弃了——离散度在平坦地区的量级与塔测误差相当,在山区只有塔测误差的一半,完全不匹配。最后的做法是分地形用塔测残差估不确定度,集合只用来做趋势稳定性检验。
§4.6 海浪场:分辨率差一档的另一套产品
Ocean waves 组有 43 个变量,是单层产品里第二大的组。它的再分析分辨率是 0.5°,集合统计量是 1°,都比大气粗一档。原因是海浪由谱波浪模式计算,分辨率受限于驱动风场与波谱离散。
做海洋工程、船舶航线、近岸波浪后报的任务会用这一组;做近岸极值统计时要特别注意 0.5° 的格子可能已经包含好几个水深带,近岸浅水效应它代表不了。
§4.7 观测系统的时变:一条贯穿 87 年的隐含协变量
把 §4.1 与 §4.5 放在一起看,有个更一般的结论:ERA5 的质量不是常数,是一条随时间变的曲线。1940–1978 靠常规观测,1979 年卫星加入,1990 年代后期资料同化技术迭代,2000 年代更多卫星仪器接入。
对机器学习的影响是具体的:如果训练集覆盖 87 年,模型会学到「1960 年的风场比 2010 年平滑」这种与真实气候无关的模式。做 87 年跨度建模时,年份本身就该作为协变量进模型,或者按观测系统时代分段建模。
§4.2 的案例里,1985–2010 段正好跨在这条曲线的上升期。该项目组最后在报告里加了一节「数据同质性说明」,明确 1985–2000 的资源统计与 2000 年后的不可直接比较。这一节后来成了评审最认可的部分。
§5 工具层:怎么取、怎么验、怎么复现
§5.1 三条获取路径
| 路径 | 门槛 | 适合 | 代价 |
|---|---|---|---|
| CDS 网页表单 | CDS 账号 + 接受条款 | 一次性小切片、探索 | 手工点击,不便于批量 |
| CDS 检索 API(cdsapi) | 同上,另需 API key | 批量、可复现、进流水线 | 要写脚本,要处理排队 |
| 原生分辨率完整版 | 另有一套流程与门槛 | 需要原生分辨率的研究 | 数据量与门槛都高得多 |
对 95% 的使用者,第二条路径是对的。它的核心价值不在「能自动化」,而在于每一次取数都能被完整记录下来——参数、版本、时间戳,写进仓库就是一个可复现的档案。
在动手写第一行请求之前,有三个决定必须先定下来,因为它们决定了后面所有代码的形状。
第一,变量清单。 是从 262 个里挑出你要的五个十个,还是「先都拉下来再筛」。后者在小区域短时段可行,在长时段上是灾难性的——262 个变量全时段的请求规模会远超单请求上限。正确的做法是先列出研究问题需要哪几个物理量,再从表单里找到对应的短名,而不是在表单里逐个勾。
第二,时间与空间的范围与分块方式。 一个横跨四十年、覆盖半个中国的请求几乎一定超限。分块的两个轴是时间和空间,选哪个轴分,取决于下游怎么用:要做时间序列分析就按时间分块、每块覆盖全区域;要做空间场分析就按空间分块、每块覆盖全时段。混着分,最后拼起来的数组会很别扭。
第三,数据格式。 GRIB 与 NetCDF 的内容一样,只是编码不同。进 Python 生态选 NetCDF,它的坐标与维度名会被 xarray 直接识别;进业务系统或需要长期归档选 GRIB,它的自描述结构在几十年尺度上更稳。两者的体积与精度没有实质差别,不要为「哪个更小」纠结。
这三件事定下来之后,剩下的才是写请求参数。顺序反过来——先写请求、跑到一半发现范围不对——是这份数据上最常见的浪费。
§5.2 认证与环境准备
先在 CDS 网站注册账号,并在个人页找到 API key。把它写进 ~/.cdsapirc:
mkdir -p ~/.cdsapirc.d
cat > ~/.cdsapirc <<'EOF'
url: https://cds.climate.copernicus.eu/api
key: $CDSAPI_KEY
EOF
chmod 600 ~/.cdsapirc
把 key 放在环境变量里而不是明文写进文件,是为了这个文件可以安全地跟着 dotfiles 走。第二条路径的价值在于「能进版本控制」,而版本控制的前提是里面没有密钥。
§5.3 一次最小可运行的取数
import cdsapi
client = cdsapi.Client()
client.retrieve(
"reanalysis-era5-single-levels",
{
"product_type": ["reanalysis"],
"variable": [
"2m_temperature",
"10m_u_component_of_wind",
"10m_v_component_of_wind",
],
"year": ["2020"],
"month": ["01"],
"day": ["01"],
"time": ["00:00", "06:00", "12:00", "18:00"],
"data_format": "netcdf",
"download_format": "unarchived",
"area": [45, 110, 35, 125],
},
"era5_2020_sample.nc",
)
几处值得说明:
area 的顺序是 [北, 西, 南, 东],不是常见的 [南, 北, 西, 东]。写反了不会报错,会拿到一块别处的数据。上面这块是 35–45°N、110–125°E。
data_format 只有 grib 与 netcdf 两个合法值,download_format 只有 unarchived 与 zip。这两个参数容易搞混名字,因为它们是「数据格式」与「打包格式」两件事。
请求里没有 product_type: ensemble_members 就没有 number 维。需要成员时把它加上,返回的数组会多一维。
§5.4 先算体积,再提交
CDS 对每个请求算一个「cost」,单位是数据的规模。这个接口不需要提交任务,可以直接问:
curl -s -X POST \
"https://cds.climate.copernicus.eu/api/retrieve/v1/processes/reanalysis-era5-single-levels/costing" \
-H "Content-Type: application/json" \
-d '{"inputs":{"product_type":["reanalysis"],"variable":["2m_temperature"],
"year":["2020"],"month":["01"],"day":["01"],"time":["00:00"],
"data_format":"grib"}}'
返回是 {"id":"size","cost":6.0,"limit":121000.0} 这样的结构。cost 随变量数、时刻数、区域面积线性增长,limit 是单请求上限。
先算再提交的习惯能省下大量时间:一个看起来不大的请求(比如十年的全球 100 米风)可能远超上限,提交后要等很久才发现被拒。
§5.5 读回来:维度顺序与坐标
import xarray as xr
ds = xr.open_dataset("era5_2020_sample.nc")
print(ds)
t2m = ds["t2m"] - 273.15 # K -> degC
print(t2m.dims) # ('valid_time', 'latitude', 'longitude')
print(float(t2m.min()), float(t2m.max()))
两件事要留意。第一,t2m 的单位是开尔文,温度类变量都要减 273.15 才是摄氏度;辐射、通量的单位各不相同,混算之前手边要有一张量纲表。第二,NetCDF 的维度名是 valid_time 而不是 time,坐标是 latitude/longitude 而不是 lat/lon——照抄旧代码会 KeyError。
§5.6 把请求固化成可复现的记录
import hashlib, json, datetime, pathlib
def request_fingerprint(params: dict, dataset_id: str = "reanalysis-era5-single-levels") -> str:
payload = json.dumps(
{"dataset": dataset_id, "params": params},
sort_keys=True, ensure_ascii=False,
).encode("utf-8")
return hashlib.sha256(payload).hexdigest()[:16]
params = {
"product_type": ["reanalysis"],
"variable": ["2m_temperature"],
"year": ["2020"], "month": ["01"], "day": ["01"],
"time": ["00:00"], "data_format": "grib",
}
fp = request_fingerprint(params)
meta = {
"fingerprint": fp,
"requested_at": datetime.datetime.now(datetime.timezone.utc).isoformat(),
"process_version": "1.0.0",
"doi": "10.24381/cds.adbb2d47",
}
pathlib.Path(f"provenance_{fp}.json").write_text(json.dumps(meta, indent=2))
print(meta)
指纹只覆盖请求参数,不覆盖结果——因为结果会变(§3.4)。所以这份记录要配合「下载后的文件校验和」一起存,两者都在,才能说明「我拿到的就是那一刻的那份」。
§5.7 用约束表预先排雷
官方发布了一份约束文件,按月份列出「哪些变量在某些年份不可取」。它不是缺失数据说明,是规则表。
import json, urllib.request
URL = ("https://object-store.os-api.cci2.ecmwf.int:443/cci2-prod-catalogue/"
"resources/reanalysis-era5-single-levels/"
"constraints_785675f80be9c05534592e509d626ced208877822d4b14144bcb46871fe7000c.json")
rules = json.load(urllib.request.urlopen(URL, timeout=120))
target_year, target_month, target_pt = "1940", "01", "ensemble_members"
hits = [
r for r in rules
if target_year in r["year"] and target_month in r["month"]
and target_pt in r["product_type"]
]
blocked = set()
for r in hits:
blocked.update(r["variable"])
print(len(rules), "条规则;该组合下不可取变量数:", len(blocked))
这段读出来的是规则本身,不是数据。它的用处是:在提交一个横跨几十年的批量请求之前,先把这个组合下不可取的变量剔掉,避免拿到一堆空文件之后才发现。
§5.8 一个常见故障:请求通过了,返回是空的
空结果几乎总有两个来源。
一是变量在该时段不存在。上例里 ensemble_members 在 1940 年 1 月只有 46 个变量可取,其余 200 多个都不提供。按变量名盲拉全时段,会得到「一部分年月有、一部分没有」的数组,下游统计会静默出错。
二是区域坐标写反。area 写成 [35, 110, 45, 125](南在前)时,CDS 会返回一块纬度范围为空或错位的区域,有时直接返回空文件。
两个故障都不报错。所以流程里必须有一个「拉回来之后检查形状」的步骤,而不是相信请求成功就等于数据在。
§5.9 §4.2 的案例在这一层的落地
回到 §4.2 的项目。他们最终的做法:
- 用约束表先筛一遍,确认 100 米风、2 米气温在 1985 年起的全时段都可取;
- 按省界外扩 2° 取 area,按月分块提交,每块单独记指纹;
- 拉回来先检查形状,再检查缺测比例;
- 用 2010 年后的塔测做分位数映射,把映射函数的训练时段与样本量写进报告;
- 用集合离散度只做趋势稳定性检验,不做误差条。
五步里有三步是为了对付「不报错的错」。这也是这份数据在工程上最需要纪律的地方。
§6 层与层之间:它在本库中的位置
§6.1 库内的地学家底
本库的地球观测与空间类条目目前不多,能直接与 ERA5 形成上下游关系的,主要是三类:卫星影像类(如 EuroSAT 的 Sentinel-2 瓦片)、环境监测类(如 AQS 的地面空气质量监测)、以及全球统计汇编类(如 GBD、世界银行的国别指标)。
ERA5 与它们的关系是「同一空间坐标,不同物理量」。它不替代任何一类,而是给它们配上一层大气状态。
§6.2 与 EuroSAT 的分工
EuroSAT 是 64×64 的 Sentinel-2 瓦片,带经纬度,任务是地表覆盖分类。ERA5 可以在两处与它配合:一是给瓦片配当日的温度、降水、云量做协变量;二是用云量字段反推「这张瓦片拍摄时云是不是很厚」,辅助质量筛查。
两边的分辨率差得远:10 米对 28 公里。这种配合只能做「大尺度背景」层面,不能做「逐瓦片修正」。
§6.3 与 AQS 的分工
AQS 是美国地面的空气质量站点监测,站点是点,时间是小时或日。ERA5 在这里扮演的是气象协变量:风速、风向、边界层高度、温度、湿度、降水,都是解释污染物浓度日变化与输送的标准输入。做 PM2.5 预测的模型,几乎都会把 ERA5 的几个量拼进特征表。
分工很清楚:AQS 提供「污染物浓度真值」,ERA5 提供「决定浓度分布的气象条件」。前者是点上的仪器读数,后者是格点的分析场。
§6.4 与全球统计汇编的分工
GBD、世界银行开放数据、Our World in Data 这类是国别或地区的年度统计。ERA5 与它们连接时,通常先把格点按人口或行政边界加权平均到国别月度,再与统计量做相关分析或作为回归的协变量。冬季低温相关的超额死亡、热浪与心血管事件、疟疾与降水的关系,都是这条路径上的标准问题。
§6.5 检索路径建议
按需求找条目:要气象场本身 → 本篇所述的单层集合;要卫星影像 → EuroSAT;要地面污染物 → AQS;要健康结局 → GBD 或 NHANES;要国别经济与社会指标 → 世界银行。要「气象 + 健康」的组合研究,从单层集合出发到 GBD,中间那层「格点聚合到行政单元」需要自己写。
§7 质量评估与局限:它不该按什么标准评价
§7.0 阅读本节前需要知道的一件事
用「观测数据集」的尺子去量 ERA5,会得出「全是模式输出、不是仪器读数、没有误差」的结论;用「AI 基准」的尺子去量它,会得出「没有标签、没有任务定义、没有排行榜」的结论。两种结论都对,但都没回答它为什么被大规模引用。
它被引用的原因在于一致性与连续性:同一套同化系统、同一套网格、同一种物理定律,贯穿 87 年。观测数据做不到这一点——仪器换了三代,站点搬了两次,海洋上空几十年没测过。对于任何想把「历史天气」当作输入或验证场的模型,连续性比单点精度重要得多。
所以评价它应该用的尺子是:作为一套跨时空一致的物理场,它的同质性与可追溯性做得怎么样。
§7.1 二种常见的评价框架错位
| 常见错位 | 表现 | 应该怎么想 |
|---|---|---|
| 拿站点观测的精度标准套它 | 抱怨某个站的气温与 ERA5 差 2 度 | 格点场与点观测本来就有代表性差异;该比的是偏差的统计量与时空结构 |
| 拿排行榜数据集的标准套它 | 抱怨没有训练/测试划分、没有指标 | 它是原料,不是考题;划分与指标由使用者按任务定义 |
§7.2 DAIMS 二十四项逐条对照
DAIMS(数据统计与元数据标准,Data Documentation Initiative 提出的数据质量评估框架)原本面向社会科学调查数据,这里借用它的二十四项检查点,把这份数据在元数据与可追溯性上的成熟度摊开来看。
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 宽格式 | ⚠️ | 网格场不是表格,需要先切片或降维才能宽表化 |
| 2 | 标准记录层级 | ✅ | 概念上边界清楚:变量 × 时刻 × 格点,无嵌套歧义 |
| 3 | 变量名与定义 | ✅ | 262 个短名有明确枚举,长名在文档中定义 |
| 4 | 变量与问题匹配 | ✅ | 气象要素与气候/环境问题高度匹配 |
| 5 | 分类与编码 | ⚠️ | 变量无统一分组编码,表单分组是界面设计不是分类体系 |
| 6 | 数据源 | ✅ | 同化系统、观测类型、模式版本均有文档 |
| 7 | 采集方式与工具 | ✅ | IFS 同化,方法学有同行评议论文 |
| 8 | 采集时间 | ✅ | 逐小时时间戳明确 |
| 9 | 代理变量 | ✅ | 不涉及 |
| 10 | 权重 | ✅ | 不涉及抽样权重 |
| 11 | 缺失值编码 | ⚠️ | 约束表标注「不可取」与「真缺测」不是一回事,需分别处理 |
| 12 | 数据质量声明 | ⚠️ | 有文档与论文,但无逐格点的质量标记字段 |
| 13 | 元数据完整性 | ✅ | 目录 API 提供 STAC 元数据、许可、包络、DOI |
| 14 | 时间覆盖 | ✅ | 1940 至今,连续 |
| 15 | 空间覆盖 | ✅ | 全球,规则经纬网 |
| 16 | 地理参照 | ✅ | 固定 0.25° 网格,可定位 |
| 17 | 记录完整性 | ⚠️ | 同质性随时间变,非均匀 |
| 18 | 计数 | ✅ | 变量数、网格数、时间步数皆可精确计算 |
| 19 | 文件大小 | ✅ | 有 costing 接口可预估 |
| 20 | 数据存储 | ✅ | 长期存档于 CDS |
| 21 | 数据处理 | ✅ | 有文档化的重网格与后处理 |
| 22 | 数据访问 | ⚠️ | 需账号与条款接受,不能匿名直下 |
| 23 | 许可与使用限制 | ✅ | CC BY 4.0,机器可读 |
| 24 | 引用与致谢 | ✅ | 有 DOI 与推荐引用格式 |
§7.3 逐条局限
同质性随时间变。 见 §4.1 与 §4.7。这是最根本的一条。
变量不是全时段齐备。 见 §5.7 与 §5.8。262 是并集计数。
近实时段不可复现。 ERA5T 会被终版替换。以它做的实验,两个月后重跑结果可能不同。
集合产品网格不同。 3 小时、0.5° 对 逐小时、0.25°。不能直接配对。
降采样不是原生。 单层集合是重网格子集,原生分辨率要在别处取。
降水与云在格点上被平滑。 极端值被摊薄,不能做局地尺度事件研究。
海浪分辨率粗一档。 近岸浅水效应代表不了。
不允许匿名访问。 需要账号与条款接受,这对「一键复现」的脚本设计有实际约束。
§7.4 该被追问什么、不该被追问什么
该追问的:同化系统的时变、变量的时段可用性、集合的构造目的、降采样带来的信息损失、ERA5T 的修订记录。
不该追问的:为什么没有标注、为什么没有划分、为什么单个格点与测站不完全一致。这三件事不在它的设计目标里。
§7.5 外部验证:怎么用别人的数据检验它
ERA5 的可信度不能靠自己内部一致来证明。有效的检验路径有三条,各自回答不同的问题。
| 检验路径 | 回答什么 | 需要的对照数据 |
|---|---|---|
| 对站点观测 | 格点值与仪器读数差多少、偏差的时空结构如何 | 地面气象站、探空、浮标 |
| 对独立再分析 | 不同同化系统是否给出相似的大尺度形势 | 其他机构的再分析产品 |
| 对遥感反演 | 特定变量(海表温度、雪深、植被指数)的外在一致性 | 卫星产品 |
三条路径里,第一条最直接。它的正确用法不是「逐点比误差然后报一个均方根」,而是分区域、分季节、分时段报偏差统计:山地和平原的偏差不一样,冬季和夏季不一样,卫星时代前后不一样。只报一个总体均方根,会把三种性质完全不同的偏差混成一个数。
§4.2 的案例用的正是第一条路径的简化版。该项目组手上有 2010 年后的塔测,他们把 ERA5 的 100 米风与塔测 70 米风按风廓线换算到同一高度,做了逐小时与逐月的偏差统计,发现山区夏季的偏差明显大于冬季,白天大于夜间。这个发现直接导致了「分季节、分时段校准」的方案,比单一的全年平均校准好了不少。
第二条路径对做机器学习的人尤其值得用。如果两个独立同化系统在某地给出差异很大的风场,那么基于 ERA5 训练的模型在该地的预测可信度就值得怀疑——这是数据层的不确定,模型改不了。
第三条路径只在特定变量上有意义。海表温度、雪覆盖、植被这类逐日轨道可见的产品可以对得上,2 米气温对不上(卫星反演的是晴空条件下的地表温度,与 2 米气温是两个量)。
§8 生态与版本:它为什么还能被用下去
§8.1 版本时间线
| 时间 | 事件 |
|---|---|
| 1979 年 | ERA5 正式覆盖的起点(业务气象卫星时代) |
| 后续年份 | 往回扩展到 1940 年 |
| 2018-06-14 | CDS 上该集合首次发布 |
| 持续 | 每日更新,延迟约 5 天,ERA5T 先行 |
| 持续 | 2–3 个月窗口内可能被终版替换 |
§8.2 它在生态中的位置
ERA5 在当代地球科学里的地位可以这样描述:它是「历史大气状态」的公共默认值。想描述过去某时某地的天气,最省事的做法就是查 ERA5。
这一定位带来两个后果。向上游,它依赖全球观测系统的持续运行——各国的地面站、探空站、卫星。向下游,它喂养了整个数据驱动天气预报的方向:从四维变分强约束方法到自回归式的时空模型,训练数据大多是 ERA5。
§8.3 谁在依赖它
| 依赖方 | 用途 |
|---|---|
| 数据驱动天气模型研究 | 训练与验证的通用语料 |
| 可再生能源资源评估 | 风、光的长历史序列 |
| 农业与水文 | 降水、土壤湿度、蒸散 |
| 空气污染与健康研究 | 气象协变量、温度相关死亡 |
| 海洋与海岸工程 | 波浪、风应力的后报 |
| 卫星遥感 | 大气校正与几何定标的外部参数 |
§4.2 的案例在表里的位置是第二行。它的整个回溯链条建立在这一行的稳定性上,所以它必须在报告里说明用的是哪个版本的 ERA5、何时取的数。
§8.4 它为什么能持续
三个原因叠在一起。
第一是机构承载。它由 ECMWF 制作、由欧盟哥白尼计划资助、由 CDS 分发。这套组合给了它几十年级别的资金与人力承诺,不是某个课题组的一次性产出。
第二是重算机制。ERA5 不是冻结的快照,而是可以被回溯重算的轨迹。观测资料集改进、同化系统升级,都可以重跑历史段。这保证了它不会因为早期的错误而逐渐过时。
第三是网络效应。下游的模型、论文、工具链都建在它上面。换成别的再分析,上游的数据接口、变量名、评估协议都得改。切换成本本身成了黏性。
§8.5 引用与许可
许可的事实很明确:CDS 的 STAC 目录接口对 reanalysis-era5-single-levels 的 license 字段回传 CC-BY-4.0,同一条目还挂了指向 SPDX 的 license 链接。
使用上要注意三件事。第一,CC BY 4.0 要求署名,署名方式按 Copernicus 的约定写(数据来源 C3S、生产方 ECMWF)。第二,账号与条款接受是访问环节的要求,与许可条款是两件事,不能因为许可开放就跳过。第三,论文里的推荐引用是那篇 Quarterly Journal of the Royal Meteorological Society 长文,加上数据 DOI,两者都给。
§9 使用指引:三条路径,一份最小实现
§9.1 三种角色,三条路
| 你的角色 | 建议路径 | 关键动作 |
|---|---|---|
| 想给现有数据配环境协变量 | 表单取少量变量 + 区域裁剪 | 先确定要哪几个量、要哪个时段、格点与目标数据怎么连接 |
| 想训练时空预测模型 | 按约束表筛变量 + 按月分块 + 记录指纹 | 先定验证协议,再定取数范围;同质性分段交代 |
| 想做长期气候分析 | 月平均集合更省事 + 分段统计 | 1978/1979 两侧分开统计,趋势与方差不混算 |
§9.2 在 AI 流水线中的位置
用一句话说:ERA5 在流水线里多数时候是输入,少数时候是输出。
当输入用时,它是空间上规则的图块序列(时间 × 纬度 × 经度 × 变量),进卷积或图网络之前要做的选择是:变量选哪几个、归一化怎么做、缺测怎么填、时间窗多长。
当输出用时(训练预测模型),它是标签的一部分,这时最要紧的是验证划分。按时间切分是底线——把 2020 年的样本随机混进训练集,模型会学到「未来的气候背景」。
§9.3 一份最小可跑的实现
import cdsapi, xarray as xr, numpy as np
c = cdsapi.Client()
c.retrieve(
"reanalysis-era5-single-levels",
{
"product_type": ["reanalysis"],
"variable": ["2m_temperature", "total_precipitation"],
"year": ["2019"], "month": ["01", "02"], "day": list(range(1, 29)),
"time": [f"{h:02d}:00" for h in range(24)],
"data_format": "netcdf", "download_format": "unarchived",
"area": [42, 112, 36, 122],
},
"era5_2019jf.nc",
)
ds = xr.open_dataset("era5_2019jf.nc").load()
t2m = ds["t2m"] - 273.15
tp = ds["tp"] * 1000.0
daily_t = t2m.resample(valid_time="1D").mean()
daily_p = tp.resample(valid_time="1D").sum()
arr = np.stack([daily_t.values, daily_p.values], axis=-1)
print(arr.shape) # (天, 纬度, 经度, 2)
print(float(np.nanmin(arr[:, :, :, 0])), float(np.nanmax(arr[:, :, :, 0])))
两个换算要解释:t2m 是开尔文,减 273.15 得到摄氏度;tp 是米,乘 1000 得到毫米。这两个换算写错是这份数据里最常见的静默错误——数值看着像模像样,量级差了三个数量级或一个温度区间。
resample 的上采样与下采样语义不同:温度取日均用 mean,降水取日总量用 sum。两者交换,结论会完全反过来。
§9.4 评估时最少要报的三件事
用 ERA5 做的结果,报告里至少要写清三件:数据取自哪个集合、什么时间取的、覆盖什么时段。缺了第三件,读者不知道你的结果有没有跨过观测系统换代;缺了前两件,别人无法复现。
§4.2 的案例的报告最后加了第四件:校准函数的训练时段与样本量。这一条不在通用清单上,但任何「用现代数据校准历史数据」的做法都应该加上它。
§10 AI 使用声明
| 栏目 | 内容 |
|---|---|
| 性质 | 全球大气再分析场,含模式输出分量,不是纯观测 |
| 用途 | 时空预测的输入与验证、环境协变量、长期气候统计 |
| 不建议用途 | 局地尺度事件判定、单站仪器读数替代、匿名批量爬取、跨 1979 直接比方差与趋势 |
| 伦理 | 无个人数据;下游若涉及健康结局,注意区域与人群尺度的生态谬误 |
| 引用 | 集合 DOI 10.24381/cds.adbb2d47 + QJRMS 长文 |
| 许可 | CC BY 4.0(目录 API license 字段),另需账号与条款接受 |
| 版本 | 集合 ID + 检索进程版本 + 取数时间戳 |
| 状态 | 在线,日更,滚动修订 |
§11 常见误读与避坑清单
| 常见说法 | 实际情况 | 证据 |
|---|---|---|
| 「ERA5 是观测数据」 | 是数据同化的分析场,含大量模式约束 | 数据集页概述对同化机制的描述 |
| 「ERA5 从 1979 年开始」 | 覆盖从 1940 开始,1979 是业务卫星时代的起点 | 目录 extent 起点 1940-01-01 |
| 「所有变量都能取到 1940 年」 | 262 是并集计数,具体变量按时段受限 | 约束文件按年月列出不可取变量 |
| 「ERA5 的速度是 0.25°」 | 再分析场 0.25°,集合统计量 0.5°,海浪再分析 0.5° | 数据集页 Horizontal resolution |
| 「集合离散度就是误差条」 | 是流依赖的不确定性抽样,非系统偏差估计 | 概述对 10 成员集合的说明 |
| 「ERA5T 就是 ERA5」 | 早期版,2–3 个月内可能被终版替换 | 概述「could be different from the final release」 |
| 「这里就是完整 ERA5」 | 是重网格降采样子集,原生分辨率在别处 | 概述「regridded subset」 |
| 「CC BY 4.0 就能匿名直下」 | 许可开放,但访问仍需账号与条款接受 | 访问流程。事实层,无需争论 |
| 「降水各小时值相加不会错」 | 累积量相加有语义前提,速率与累积混用差时间因子 | 变量命名与单位。基本物理常识 |
| 「ERA5 能替代测站数据」 | 格点分析场与点观测有代表性差异 | 空间尺度本质差异 |
附录 A 速查卡
| 键 | 值 |
|---|---|
| 集合 ID | reanalysis-era5-single-levels |
| 检索进程版本 | 1.0.0 |
| DOI | 10.24381/cds.adbb2d47 |
| 时间 | 1940-01-01 至昨日,逐小时 |
| 空间 | 全球,0.25°(再分析)/ 0.5°(集合、海浪) |
| 变量 | 262 个短名,15 个表单分组 |
| 格式 | GRIB / NetCDF |
| 更新 | 每日,约 5 天延迟 |
| 许可 | CC BY 4.0 |
| 单请求上限 | costing 接口返回 limit 字段 |
附录 B 变量分组速查
| 分组 | 变量数 | 典型用途 |
|---|---|---|
| Radiation and heat | 24 | 光伏、蒸散、地表能量平衡 |
| Ocean waves | 43 | 海洋工程、航线、近岸波浪 |
| Precipitation and rain | 11 | 水文、农业、城市内涝 |
| Soil | 9 | 农业、干旱监测 |
| Lakes | 9 | 湖泊水温和水域热力过程 |
| 热门汇总 | 11 | 快速起步 |
附录 C 术语表
| 术语 | 含义 |
|---|---|
| 再分析 | 用固定版本的数值模式与同化系统,把历史观测重新处理成连续场 |
| 数据同化 | 把观测与模式背景场按最优方式结合,得到分析场 |
| 分析场 | 同化输出的最优估计,是后续预报的起点 |
| ERA5T | 早期版,发布快、延迟低,2–3 个月内可能被修订 |
| 集合成员 | 在扰动初值与参数下的一次轨迹,用于抽样不确定性 |
| 离散度 | 集合成员之间的分散程度,反映流依赖不确定性 |
| 单层 | 垂直坐标固定或本就无垂直坐标的量,取数时不需要填气压层 |
| 累积量 | 从前一次后处理时刻到当前时刻的累积,不能跨时刻直接相加 |
| 平均速率 | 单位时间平均通量,与累积量差一个时间因子 |
| 重网格 | 把原生网格插值到规则经纬网,会损失信息 |
| 背景场 | 同化中来自模式短时预报的先验 |
| 观测系统换代 | 卫星等观测手段加入或更替导致同质性变化 |
| costing | CDS 的请求规模预估接口 |
| 约束表 | 官方发布的「哪些变量在某些年月不可取」规则文件 |
| 指纹 | 对请求参数做的摘要,用于复现记录 |
| 格心 | 网格单元的中心点,格点值定义在这里 |
| 流依赖 | 不确定性随天气形势变化的性质 |
| 代表误差 | 格点值与点观测之间的尺度不匹配造成的差异 |
| 生态谬误 | 用区域平均关系推断个体层面关系的错误 |
附录 D 常见问题
Q1:ERA5 到底有多少个变量? 262 个短名。表单分 15 组,其中 Popular 是汇总组,按组合计会重复算成 279。
Q2:为什么官方说 1940 年,很多论文却写 1979 年? 两者都对。1940 是覆盖起点,1979 是业务气象卫星时代的起点,也是很多研究选择的起点,因为那之后的观测系统更接近今天。
Q3:能不能不注册就下? 不能。许可开放与访问开放是两件事。
Q4:集合只能取 3 小时的吗? 表单上 ensemble_members 只列了 8 个时次,因为它是按 3 小时间隔抽样的设计。
Q5:NetCDF 与 GRIB 选哪个? 要进 Python 生态就选 NetCDF,要长期存档或与业务系统对接选 GRIB。两者内容一致。
Q6:为什么我拿到的降水是 0.001 这种数? 单位是米,乘 1000 才是毫米。
Q7:可以只取一个城市吗? area 最小只能切到网格步长,0.25° 一格,比一个城市大得多。
Q8:ERA5 的降水能替代雨量站吗? 不能做局地事件判定,做区域统计可以。
编辑说明
核验时间 2026-10-29。方法:读取 CDS 数据集页 HTML(overview 与 documentation 两栏),取官方口径的覆盖、分辨率、延迟、格式与集合说明;读取 STAC 目录接口 api/catalogue/v1/collections/reanalysis-era5-single-levels,取 license、extent、DOI、更新时间与相关集合;读取检索表单 JSON 与检索进程描述 api/retrieve/v1/processes/reanalysis-era5-single-levels,统计变量枚举 262、表单分组 15/合计 279、年份 87;读取约束文件,确认按年月列出的不可取变量规则;调用 costing 接口验证返回结构。未登录 CDS,未下载任何数据文件,因此没有做逐变量、逐格点的分布统计,也没有逐个核验文件体积。ECMWF Confluence 文档站与 Wiley 论文页在本环境被访问策略拦截,相关细节(如 1940–1978 扩展的官方措辞)以 CDS 页面与本库编辑的知识为限,正文中凡涉及该段的表述均限定在「覆盖从 1940 开始、1979 是业务卫星时代起点」这一可核实范围内,未引用未读到的原文。20° 以上的网格数(721×1440)为按官方分辨率推算,正文已标注。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- oisst-v2-1 — 共享标签:公共卫生与流行病学 / 时序数据 / 全球健康 / 疾病监测
- ibtracs — 共享标签:公共卫生与流行病学 / 时序数据 / 全球健康 / 疾病监测
- argo-gdac-floats — 共享标签:公共卫生与流行病学 / 时序数据 / 全球健康 / 疾病监测
- our-world-in-data — 共享标签:公共卫生与流行病学 / 时序数据 / 全球健康
- ndbc-buoy — 共享标签:公共卫生与流行病学 / 时序数据 / 疾病监测
- noaa-cors-gnss — 共享标签:公共卫生与流行病学 / 时序数据 / 疾病监测
- amrnet — 共享标签:公共卫生与流行病学 / 全球健康 / 疾病监测
- gbd-results — 共享标签:公共卫生与流行病学 / 全球健康 / 疾病监测
- gho-steps — 共享标签:公共卫生与流行病学 / 全球健康 / 疾病监测
- wpp — 共享标签:公共卫生与流行病学 / 时序数据 / 全球健康
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

