Tech/ IRI下载气候数据
Published:
在CDS数据中心宕机的时候,我用这种方式在IRI补充了急用的C3S季节预测数据,代码参见:code
概述
IRI climate data library是哥大的气候数据下载中心,从这里可以下载多国机构的预测、观测数据,参见这个目录(甚至有CMA的数据,不过都是一些比较老的模式了)。
我们主要关注里面的次季节和季节预测,也就是NMME和subX计划。美国很多机构的在研发S2S模式,但只有NCEP的CFS参与了S2S project,其余的模式仅可以从这里获取,例如,GFDL-SPEAR只在NMME有,GEOS-S2S可以在NMME或subX下载。
部分数据下载受限,需要首先需要注册IRI的账户,并提交申请,所以需要预留一段审核的时间。
网页交互界面加载总是很慢,不过实际的数据下载速度还行。
expert mode选择数据
如果直接选择data files,access到的是整个数据集。如果需要选取特定的时段、空间范围等,则需要用data viewer交互式选择想要的数据,或者在页面上方选到exper mode,用脚本模式来设置。
脚本主要做的事情是给每个坐标轴,用RANGE, VALUE, VALUES等表示选择的范围或点。坐标轴名称在数据集说明页的“Independent Variables (Grids)”一节给出,RANGE VALUES等顾名思义,是选择范围或者单点。
例如,如果要从subX下载GEO-S2S的部分数据,脚本可以如下:
SOURCES .Models .SubX .GMAO .GEOS_V2p1 .forecast .pr
M (1) VALUE
S (01 Apr 2022) (10 Apr 2022) RANGE
Y -10 10 RANGE
X -70 -20 RANGE
下载数据
编辑好脚本后会自动生成数据的下载地址,例如上述脚本所对应的地址是
'http://iridl.ldeo.columbia.edu/SOURCES/.Models/.SubX/.GMAO/.GEOS_V2p1/.forecast/.pr/M/%281%29/VALUE/S/%2801%20Apr%202022%29/%2810%20Apr%202022%29/RANGE/Y/-10/10/RANGE/X/-70/-20/RANGE/dods'
这个网址是有规律的,其实只是直接展开expert mode的文字。%28
表示左括号 (
,%29
表示右括号 )
,%20
表示同一个字符串内部的分隔,没加括号的全部用 /
分隔
生成的网址可以通过opendap协议获取(2024更新:这里提到的opendap现在直接叫DOD了),这个协议本质上是在本地获取远程数据的头文件,但不一次性下载整个数据,而是每次按需获取,因此不会限制文件的大小。
查询各种资料,说是常见读取nc的方法都能直接access到opendap的数据,例如做大气的同行可能会尝试的几种方式是:
- matlab
- 比较老版本的matlab需要安装opendap库,matlab2012a之后可以直接用内置函数读取 参考
- Python
- netcdf4包和xarray可以用online的方式读dap数据,例如:xarray读取opendap数据的文档
- pydap.client可以下载IRI的数据
- 或者可以用nco直接操作,参见文档
尝试下载C3S平台的季节预测数据时,以上尝试都没有成功,经过排查,主要是数据集不公开,需要验证的原因。用Pydap的内置session方法用户名密码登录、直接改url(Basic & Digest验证方式)、内置的cas函数(只给esgf和NASA EARTHDATA做了配置)和 urllib的HTTP自动登录方法,这几种方法均无效。
最终成功的下载方式是用request库直接获取nc文件,这时网址的形式和opandap的地址类似但稍有不同,例如:
https://iridl.ldeo.columbia.edu/SOURCES/.EU/.Copernicus/.CDS/.C3S/.ECMWF/.SEAS5/.hindcast/.va/S/(Jan%201993)/(Nov%202016)/RANGE/L/(2.5)/VALUE/P/(700)/VALUE/Y/(4S)/(60N)/RANGE/X/(64E)/(160E)/RANGE/data.nc
- 注册验证iri的账户,申请访问所需的数据集,等IRI中心发来一个密码用于登录
- 打开Chrome(safari不行)在交互式页面尝试下载数据,扒出Chrome的cookie信息
- 输入给request,脚本如下,需要将url,path/to/file,Cookie,User-Agent这四项替换成自己的
import requests
session = requests.Session()
headers = {
'Cookie': xxxxx
'User-Agent': xxxxx
}
response = session.get(url=url, headers=headers)
with open('/path/to/save/file.nc', 'wb') as f:
f.write(response.content)
- 需要经常检查cookie有没有失效,然后手动换上新的
其他参考
- 另有一些从IRI下载subx的代码可以参考:Kathy's