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的数据,例如做大气的同行可能会尝试的几种方式是:

  1. matlab
  • 比较老版本的matlab需要安装opendap库,matlab2012a之后可以直接用内置函数读取 参考
  1. Python
  1. 或者可以用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