前言

包含气象家园个人博客的精华内容

准备&配置
正确地获取脚本和参数
下载策略及注意事项
常见问题解答(FAQ

这四部主要针对三类不同人群:

如果你完全没有看过关于批量下载ECMWF数据的文章,那么我建议你从第1部分开始看。
如果你看了相关的文章并且已经成功完成了配置工作,那么请从第2部分开始看。
如果你前两部分都已经实践过了,但是遇到了一些麻烦,例如程序崩溃了不知道原因,找不到某个文件夹之类的,那么请直接从第4部分开始看。(没错我说的就是气象家园那篇帖子里各种提问以及声称“我遇到了相同问题”的朋友们)


一、准备&配置

想要获取ECMWF的公开数据首先需要在网站注册一个账号,以前我注册那会儿需要翻墙才能注册成功,现在似乎不需要了。值得注意的是,你的EC账户是不能自定义密码的,你的密码是EC通过邮件的方式给你分配的,所以建议你在Chrome中自动保存密码。注册完并且登录账户以后,点开这个网址:https://api.ecmwf.int/v1/key/,然后浏览器会在新的标签页上显示如下的内容。

批量EC数据下载-风君雪科技博客
API-Key信息页面

配置

macOS和Linux系统:你需要把灰色方框里面的内容复制粘贴到一个名叫.ecmwfapirc的文本文件里(推荐使用Sublime Text文本编辑器),并且该文件要放在~目录(Linux的~是/home/,macOS是~/Users//)下。

Windows:,你可以打开一个空白的记事本,把花括号的内容复制粘贴过去,然后保存到你cmd命令行初始的路径。

确保pip已安装的情况下,我们开始安装ecmwfapi。

在Windows系统中,cmd执行

# have admin privilege 
pip install ecmwf-api-client
# have not
pip install --user ecmwf-api-client

# or
conda install -c conda-forge ecmwf-api-client

在macOS/Linux系统中,如果

# 有root权限,则执行
sudo pip install https://software.ecmwf.int/wiki/download/attachments/56664858/ecmwf-api-client-python.tgz
# 若无root权限,则执行
pip install --user https://software.ecmwf.int/wiki/download/attachments/56664858/ecmwf-api-client-python.tgz

完成以后可以在终端检验一下是否安装成功。

- >>> from ecmwfapi import ECMWFDataServer
- >>>

二、批量下载

要下载ECMWF的数据,就绕不开MARS,它是Meteorological Archival and Retrieval System的简称,可以把它理解成一个类似于数据库的数据管理系统。MARS有自己语法,纯MARS用户可以直接使用MARS命令去调取数据,然而这只是内部人员或者商业合作伙伴(花了钱的那种)才有的特权,可能是出于安全和管理的考虑,公共用户无权直接使用MARS命令,需要使用MARS的API去调用MARS。

这就好比是你想找某人帮你个忙,你提出面谈,但是他觉得你俩不熟,只让你用微信跟他聊。直接使用MARS语法就相当于是面谈,而使用MARS API就相当于是微信联系。

ECMWF的公开数据库包含有多个数据集,这些数据集的开放政策是不一样的,有些数据集的开放权限是没有条款限制的,有些却需要你接受他们的一些政策条款才能获得下载许可权,你可以在这里查看这些数据集的开放政策。其中除了Licence为general以外的数据集(general是完全公开,默认为Accepted),都需要你手动点开并点击Accept的,否则你在使用脚本下载该数据集的数据的时候会报错,所以我建议你上来就把它们一口气全部Accept了,省得以后麻烦。

保证了数据集的可用性,下面就是要开始建立脚本了。建立脚本非常的简单,先到这里找到你想要检索数据的数据集。

批量EC数据下载-风君雪科技博客选择数据集

以ERA-Interim为例,进入MARS的Web-API,你可以在这里面根据需要选择你关注的参数,时间参数只能单选,就随便选一个时间就行,后面在脚本里修改。选择完成后把页面拉到最下面,点View the MARS request

在之后弹出的页面里,ECMWF就给我们把Python下载的脚本写好了。

批量EC数据下载-风君雪科技博客

在此基础上,批量下载的两种方法

修改 "date": "1989-01-01/to/2017-12-31",

for iyear in range(1989, 2018):  # 
    for imonth in range(1, 13):
        st = '{:4}-{:0>2}-01/to/{:4}-{:0>2}-31'.format(iyear, imonth,iyear,imonth)
        server.retrieve({
        	...
            "date": st,
            ...
        })

查看服务器队列

这里(请先登录)

关于参数的编码问题

我们可以看到,脚本里有”param”: “58.162”这么一个参数,这就是变量名参数,我在Web-API里选择的是Vertical integral of ozone,但是到这里变成了58.162。看来ECMWF有一个编码表,把每个变量都编为一个编码,然后用编码调用。那么这个编码表去哪里找呢?

首先,进入这个页面。在右上角的搜索框里搜索你想要的找的变量名,例如前面我选的那个Vertical integral of ozone

找到以后点开会出现详情页面。

批量EC数据下载-风君雪科技博客详情页面与编码推算

在详情页面里的GRIB Edition1里面找到ECMWF(这个例子里只有ECWMF,其实有些变量还有很多其他的数据源,比如WMO),然后根据右侧的Value可以推算出这个变量的编码,具体如图所示。

这样你就可以找到任何变量的编码的,但是其实你并没有必要这样做,因为即使你在这里找到了你想要的变量编码,但是它的很多其他参数你是不知道的,比如说你不知道它在什么时间段里有值,它的数据层级是怎样的等等。所以在实际使用的时候,你还是应该使用前面提到的Web API的方法获取脚本和参数。

但是这个参数检索表也有它存在的意义,你可以在里面查看它的一些信息,比如Description(简介)、Short Name(存在nc文件中的变量名)、Units(单位),虽然有时候这个Description会缺失(比如当前这个例子),但是还是有很多变量它会给你一些简短的介绍,让你对这个变量有一个了解。


三、下载策略和注意事项

下载量比较大的情况,在远程服务器上挂后台运行。具体命令是

nohup python example_download.py &

关于如何提高检索效率的问题,根据官方给出的建议

关于程序中途退出的处理

有时候我们可能数据请求已经提交了,结果因为网络问题、关闭终端或者其他什么原因导致本地程序中断了。这时候不要慌,因为你本地的程序虽然中断了,但是ECMWF服务器上MARS的程序还在跑(pai)着(dui)呢。你不要重复提交,否则可能会被增加延迟权重,增加等待时间。

这个时候正确的处理姿势是到这里(请先登录)来查看自己joblist,对于你的每一次成功提交,ECMWF都会处理到最终结果,除非是失败提交(如权限不够,参数不存在等)会显示aborted。你可以在这里下载之前提交请求后处理出来(未成功下载过)的结果,就像下图中所示。一旦你成功下载过一次,ECMWF就会从服务器中把该下载链接移除,并在download下面写上expired。

注意,这里说的是成功下载,也就是说假如你点击那个download链接下载到一半突然电脑的WiFi断了,下载失败,在你重新连上WiFi以后这个download依然可用,直到你确确实实把文件完整下载到本地以后,这个链接才会失效。

其实如果你只用Python进行submit,然后每次都到joblist里点击链接下载也未尝不可,毕竟对有些人来说可能看网页会更亲切一些。


四、常见问题解答(FAQ)

总结了以下几个案例:

案例一:找不到ecmwf-api-client-python文件夹

这位同学之所以遇到这个问题,是因为TA不太了解Python的包管理机制。楼主的方法是直接下载源码,然后在源码的同级目录下进行操作,而这位同学是用pip安装的模块包,这种情况下包的源码路径是由pip进行管理的,你根本不需要知道它在哪。用pip安装是不需要受同级目录限制的,因此这位同学其实根本不需要也不应该完全按照楼主的步骤找到这个文件夹,把脚本放在任何目录下都可以顺利运行。

案例二:提交不具备数据集权限的请求

这位同学问这个问题显然是没有看错误提示,错误提示里写了你没有获取tigge数据集的权限,需要你去Accept一下条款。所以请到这里Accept一下。同时建议到这里把所有数据集全部Accept一下,省去不必要的麻烦。

案例三:为什么一直在排队?是不是有什么问题?

排队是因为请求的人多,如果提示Request is queued,那说明它确实在排队。其实如果你等不及把程序关了,MARS后台还是会完成你的请求的,可以在joblist上查看,如果完成了可以直接从网站下载。

延伸阅读:

Access ECMWF Public Datasets

MARS user documentation

MARS Intro

Retrieval efficiency

Reference

http://www.clarmy.net/2018/09/16/how-to-download-data-from-ecmwf-in-batch/