ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ERA5气象数据下载全攻略:网页交互与CDS API批量获取技巧

ERA5气象数据下载全攻略:网页交互与CDS API批量获取技巧 先说句实在话最近几年做气象、气候、水文甚至环境方向研究的人几乎都绕不开ERA5这套数据。ERA5是欧洲中期天气预报中心ECMWF发布的第五代全球再分析资料时间跨度从1940年到现在空间分辨率大概30公里变量涵盖了气温、降水、风场、湿度、辐射、土壤湿度等等基本你能想到的大气近地面量它都有。正因为覆盖面广、精度靠谱ERA5几乎成了科研圈和工程圈默认的“标准数据集”。但数据再好下载不下来也白搭。很多新手第一次接触ERA5往往卡在第一步到底怎么把数据弄到本地我见过不少人对着网页点点点结果下了一晚上还没下完也见过有人明明只是要一个月的降水却把全球全时次的数据全拖下来了硬盘直接爆掉。这篇文章我就把目前最主流的两种下载方式——网页交互式下载和CDS API批量下载——从头到尾捋一遍包括注册、下单、脚本参数、踩过的坑尽量让看完的人能直接上手。1. 先把路子理清楚两种方式各自的适用场景ERA5本身并不直接给你一个“下载全部数据”的按钮它需要你指定变量、时间、区域、分辨率等一大堆条件然后提交到数据中心去处理处理完才能下载。这个流程决定了下载效率和你对数据理解的程度直接相关。两种主流方式本质上是同一条数据管道的两种客户入口。1.1 网页交互式下载适合新手和一次性小任务网页方式就是通过CDSClimate Data Store网站在浏览器里一步步勾选参数、提交订单、等待处理完成后点下载。这种方式的好处是所见即所得所有字段都是下拉框和复选框不容易出错也不需要写任何代码。如果你只需要下几个变量、时间跨度不大、区域比较小比如“2020年夏季中国区域的2米温度和降水”网页下单完全够用。它的缺点是效率低频繁的人工交互很费时间而且浏览器下载大文件一旦断线往往要重新排队处理体验不是很好。1.2 CDS API批量下载适合大批量、重复性任务API方式是通过Python脚本或者命令行向CDS提交请求自动下载。它的核心优势在于可重复、可批量化你把请求写成一个脚本改个年份就能跑下一年数据几十年的逐小时数据挂机一夜基本能搞定而且脚本里可以设置重试机制断点续传也比网页稳得多。缺点是需要配环境、写代码对纯小白来说有一点门槛但只要照着本文一步步配置完全可以跑通。我的建议是如果你确定以后会不止一次下载数据直接上API方式省得每次都在网页上重复操作。提示不管是网页还是API下载前都要先注册CDS账号。个人使用免费也不需要走什么复杂的审批流程只需要一个常用邮箱就能注册。2. 方式一网页交互式下载零门槛搞定小批量数据2.1 注册账号并找到数据入口第一次使用先去CDS官网注册账号。注册过程非常简单邮箱验证一下设置密码就可以登录。登录之后在首页的搜索框里输入“ERA5”会出来好几个数据集选项常用的有两个ERA5 hourly data on single levels单层逐小时数据也就是大多数人用的那个和ERA5 monthly averaged data on single levels月平均数据做气候分析常用。如果你研究的是高空变量比如特定气压层的风场或位势高度还需要找ERA5 pressure levels数据集。这里要提醒一句不要一上来就搜“ERA5”然后随便点一个下载不同数据集的产品形态差别很大选错会导致后续处理非常麻烦。进入数据集详情页后点“Download data”按钮就会进入参数选择页面。这个页面是所有新手最容易懵的地方因为它不像普通文件下载那样直接给你一个文件而是需要你先“提出需求”。2.2 从选变量到提交订单的完整操作在参数选择页面你需要逐项设置以下内容Product type一般选“Reanalysis”这是标准的再分析产品。Variable要下载的变量比如2m temperature、Total precipitation、10m wind component等。可以多选但要注意一个订单里变量越多处理时间越长数据量也越大。Year/Month/Day/Time选择具体时间。逐小时数据里的Time指的是UTC时间比如你选00:00到23:00一天就有24个时次。Geographical area如果不选默认是全球Global数据量巨大。如果只需要特定区域可以在这里填北纬、西经、南纬、东经四个值。比如中国东部大致是N 45、W 100、S 15、E 130。Format推荐选NetCDF扩展名.nc因为大多数Python生态工具xarray等对NetCDF支持最好另一个选项GRIB在老牌气象软件里更好用但对一般用户来说处理起来麻烦。设置好这些之后点击“Submit form”提交页面会跳到“Your requests”面板显示一个排队队列。数据中心的处理速度取决于当前排队人数有时候几分钟有时候要半小时甚至更久。当订单状态变成“Completed”后会出现一个下载按钮点击即可保存到本地。需要特别注意的是网页下载断点续传能力很弱如果文件很大比如好几个GB建议用浏览器自带的下载管理或者直接复制下载链接到下载工具里避免中途断掉。2.3 网页下载的局限性到底在哪里很多人问我网页方式是不是不推荐其实不是它适合速度和批量要求不高的场景。真正的痛点是如果你要下10年甚至30年的逐小时数据网页下单的操作时间成本高得吓人而且一个订单的数据量巨大网页方式往往会在排队或传输阶段就出问题。这时候API方式就是唯一合理的选择。3. 方式二CDS API批量下载跑数据的主力方式3.1 环境准备与API凭证配置API方式的核心是Python的cdsapi库可以把它理解成“帮你向数据中心下单并自动接收数据的助手”。安装方式很简单pip install cdsapi装完库之后最关键的一步是配置API密钥。你需要在CDS网站上登录点击右上角头像进入个人页面里面有一个“API key”区域会显示两行信息url和key。把这两个值写入本地配置文件Windows下路径是C:\Users\你的用户名\.cdsapircLinux和macOS下是$HOME/.cdsapirc。文件内容格式如下url: https://cds.climate.copernicus.eu/api key: 你的UID:你的APIkey注意那个key是“UID冒号加API key”的组合中间是英文冒号少一个字符都会导致鉴权失败。这也是新手最容易出错的地方很多人把key单独复制出来漏掉了前面的UID结果一直报401错误。注意.cdsapirc文件不要提交到Git仓库或者分享给别人这个key等同于你账号的密码泄露后别人可以冒用你的身份下载数据相当于刷你的下载配额。3.2 一个能直接跑的下载脚本配置好了之后写Python脚本调用API。下面是一个完整示例下载中国区域2020年7月全月的地表气温和总降水量逐小时数据NetCDF格式import cdsapi client cdsapi.Client() client.retrieve( reanalysis-era5-single-levels, { product_type: reanalysis, variable: [ 2m_temperature, total_precipitation ], year: 2020, month: 07, day: [ 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 ], time: [ 00:00, 01:00, 02:00, 03:00, 04:00, 05:00, 06:00, 07:00, 08:00, 09:00, 10:00, 11:00, 12:00, 13:00, 14:00, 15:00, 16:00, 17:00, 18:00, 19:00, 20:00, 21:00, 22:00, 23:00 ], area: [45, 100, 15, 130], format: netcdf }, china_2020_07.nc )这里area参数的含义是[北纬, 西经, 南纬, 东经]经纬度都是十进制度数东经为正、西经为负。比如你只需要中国东部可以把范围缩小到[40, 105, 20, 125]数据量会小很多。脚本运行后会显示提交进度直到下载完成的本地文件路径。3.3 参数细节与常见调整脚本里最容易出问题的就是时间参数。API要求年月日和时分都写成字符串月份一定要补零比如07而不是7。另外你需要区分ERA5单层数据和气压层数据下载高空变量时数据集名称要改成reanalysis-era5-pressure-levels并在请求字典里增加pressure_level字段比如pressure_level: 850,再比如只想下载日均或月均数据那就用reanalysis-era5-single-levels-monthly-means这个数据集请求参数也会变成product_type: monthly_averaged_reanalysis时间上只需要指定年和月不需要逐小时。很多人一开始没搞清楚这些数据集名称结果脚本里名字写错报了数据集不存在的错误。下载过程中API会自动处理队列等待不需要你盯着。但有一点经验之谈如果你连续提交几十个大订单数据中心会认为你在刷接口可能临时限制你的请求频率。我个人的做法是分批提交一次不要超过5个订单每个订单控制文件大小在2GB以内这样既能保证速度又不容易被限流。4. 下载之后的处理办法和常见问题排查4.1 数据落地后的格式检查下载完成后千万别急着删原始请求。先用一个小脚本检查文件是否完整最简单的方式是用xarray打开数据看一眼维度信息import xarray as xr ds xr.open_dataset(china_2020_07.nc) print(ds) print(ds[t2m].shape)正常情况数据维度应该是[time, latitude, longitude]的顺序也可能有不同的维度顺序时间维度数量为31天乘以24小时也就是744。如果时间维度数量不对很可能下载过程中文件截断了建议删除重新下载。另外ERA5的降水变量tp单位是米m气象上习惯用毫米mm需要乘以10002米温度t2m单位是开尔文K日常分析多用摄氏度需要减去273.15。这类单位换算是ERA5数据处理中最常见的问题网上很多报错案例其实都源于单位没有换算。4.2 高频报错与排查思路API下载过程中最常见的报错就是请求被拒绝。看到HTTP 401时第一反应去检查.cdsapirc文件里的key格式看到HTTP 403时可能是IP不在许可范围内或者你的账号需要接受数据许可协议看到HTTP 400时通常是请求参数写错了比如变量名拼写错误、时间格式不对服务器会返回详细的错误日志一定要把日志里的提示读完整。还有一种情况订单显示Completed但文件下载不下来这时候多半是网络问题可以用wget或curl直接请求CDS给的下载链接往往比浏览器稳一些。4.3 几条比较实用的避坑建议第一下载大文件前先看下硬盘剩余空间。一个全年逐小时中国区域的双变量NetCDF文件轻轻松松就上20GB如果硬盘空间不够会导致写入失败而且不会自动恢复。第二脚本里加上重试逻辑。网络波动在跨区域下载时非常常见简单的方法是在循环里捕获异常并重试或者用tenacity库给请求加个重试装饰器。第三如果条件允许尽量用较高版本的cdsapi库老的0.x版本在某些Python 3.10环境里会有依赖冲突。这里再分享一个我常用的下载技巧面对多年份长序列数据时不要一个订单请求全部年份而是按年份拆成多个小请求然后再用xarray的open_mfdataset把多个文件合并。这样做的好处是单个文件下载失败只需要重下那一个文件不需要全部重新跑一遍。import xarray as xr ds xr.open_mfdataset(china_2020_*.nc, combineby_coords) print(ds)最后说下我对ERA5下载这件事的真实体会。一开始我也在网页上一个个点觉得挺方便的但后来数据量上来之后网页那套流程就成了瓶颈。切换到API之后整个流程变得非常顺手写一个脚本参数一改跑起来就可以去忙别的。实际上下载数据只是研究过程的第一步把数据结构、变量单位、空间范围这些底层关系搞清楚后面的处理分析才能不走弯路。希望这篇东西能帮你少踩几次坑。
返回列表