气象/Meteorology · 2018年9月16日 0

批量下载ECMWF数据的正确姿势

前言

之所以要写这篇文章,是因为我发现网上这方面的教程比较重复并且有一些大家很关系的问题都没有给出解答。因此我希望自己写一篇指导文章,帮助那些想要批量下载ECMWF数据的小伙伴跳过各种坑,能用正确的姿势去使用ECMWF,也能更全面地了解ECMWF的一些有用资源的入口。

在读这篇文章之前,我推荐你读一下气象家园的这篇帖子,当然如果你不读也没关系,我的这篇指导文章既包含了这篇帖子的全部内容,还将对一些帖子没涉及到的内容进行补充,同时也会对帖子下面各网友普遍关心的问题给与解答。

在正式开始之前我还要先啰嗦两句,大家估计都听说了ECMWF的MARS(EC自己的数据管理系统)API是基于Python语言的,其实,即使你完全不会Python语言的语法,你也可以无障碍使用这个基于Python的API,因为大部分时间你需要做的仅仅是修改参数而已!

为了让读者能够更高效地获取想要的指导信息,我把主要内容分为了4个部分:

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

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

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

好了,逼逼结束,我们开始。


一、准备&配置

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

API-Key信息页面

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

配置文件内容

配置文件位置

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

打开cmd的初始目录

保存配置文件

至此,你的登录配置就完成了,下一步工作就需要安装MARS的Python API了。如果你是macOS或者Linux用户,那么你无需额外安装Python,如果你是Windows用户,那么你需要自行安装Python(方法参见这里)。由于我的Windows电脑上根本就没装Python(Windows系统只是用来使用Office和打游戏的嘻嘻),所以以下内容都是在macOS上演示的,如果大家在Windows上运行出现什么问题请及时反馈。

除了Python以外,我们还需要使用pip,这是一个用于管理Python扩展包的应用程序,可以自动下载、安装Python扩展包,我们要用它来安装ECMWF的数据API:ecmwfapi。在高于Python 2.7.9 和Python 3.4 的版本中,已经自动集成了pip,可以直接使用无需额外安装,所以通常情况下Windows的用户只要在安装的时候选择了高于2.79和3.4版本的Python,就无需额外安装pip了。而在Linux和macOS下系统自带的Python版本并不确定,可以在终端执行pip --version来检查,如果不报错并正常显示版本号,说明pip已经安装,否则需要手动安装,安装方法参见这里

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

在Windows系统中,cmd执行

  • pip install https://software.ecmwf.int/wiki/download/attachments/56664858/ecmwf-api-client-python.tgz

在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

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

  • clarmydeMBP:~ clarmy$ python
  • Python 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:07:29)
  • [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
  • Type "help", "copyright", "credits" or "license" for more information.
  • >>> from ecmwfapi import ECMWFDataServer
  • >>>

没有报错,说明安装成功。

我们这里是用pip进行ecmwfapi安装的,但是有些人可能会用直接下载源码的方式来使用这个包,比如前面提到的气象家园的那篇帖子,楼主就是直接下载ecmwf-api-client-python.tgz文件,解压后在源码同级目录下进行进行使用的。这种方法有一些缺陷,那就是如果不把模块包的路径添加到环境变量PYTHONPATH里(PYTHONPATH就是可调用模块的搜索路径列表,只有路径在该表中的模块包才能被调用),就只能把脚本放在源文件的同级(即ecmwf-api-client/)目录下使用,这极大地限制了使用场景。而pip方法会把模块包安装在一个PYTHONPATH已包含的路径中,无论当前工作目录在哪里都可以调用该模块。因此强烈建议大家使用pip安装,可以省去很多麻烦。

至此,我们的前期配置和准备工作就完成了。


二、正确地获取脚本和参数

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

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

你与MARS

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

公开数据集许可政策

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

选择数据集

以ERA-Interim为例,进入MARS的Web-API,你可以在这里面根据需要选择你关注的参数,时间参数只能单选,就随便选一个时间就行,后面在脚本里修改。

选择参数

选择完成后把页面拉到最下面,点这个View the MARS request

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

自动生成Python脚本

把这段代码复制粘贴到本地的文本编辑器中,然后修改"date"参数,比如你想要下载2000年1月1日至2017年12月31日,你只需要把日期那一行改成这样:

  • "date": "2000-01-01/to/2017-12-31",

大家应该也发现了,用这种方法我们事实上只需要修改一个日期参数就行了,因为Web-API上只有日期是单选项。其实以前日期是多选的,那时候大家只需要用Web-API就可以很方便地批量下载数据,后来不知道什么时候ECMWF给改成单选了,就只能用这个Python的API了。

当然,除了日期参量,还需要修改保存文件的目标路径,也就是"target"参量,把它设置为保存文件的路径即可。还有就是可以增加"format":"netcdf"参量把文件输出为.nc格式,如果不加这个参数默认保存格式为grib;"dataset"的值不用改,它的值是从这里选的(表格最左侧的短名)。其他的变量也都不用改,至于它们的具体意义,可以参考这里这里

编辑好脚本以后,保存为py文件,例如我把它保存为example_download.py,然后我在终端执行python example_download.py,它就会开始向服务器提交请求了,如果一切顺利你就可以在你所设置的保存目录下看到你可爱的数据文件了。至此,你已经可以成功地进行批量下载ECMWF数据了。是不是很简单?是不是只需要改参数?

关于参数的编码问题

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

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

参数检索页面

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

详情页面与编码推算

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

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

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


三、下载策略和注意事项

对于量比较小的数据请求,你几乎不需要排队就可以很快得到MARS的响应。但是对于一些数据量比较大或者涉及到的数据种类比较广的请求,可能会被放在队列中延后处理,好像有时候用户提交的请求过于频繁也会被放在队列中延后处理。ECMWF官方给予的单次数据请求上限是20GB,我们在实际操作中,遇到下载量比较大的情况,建议大家在远程服务器上挂后台运行。具体命令是

  • nohup python example_download.py &

挂后台运行后你就可以关掉终端去忙其他的事了,过上个把小时甚至一两天再回来看看有没有下载完成。

关于如何提高检索效率的问题,根据官方给出的建议,检索应该尽量减少对tape的调用次数,但是到底怎么样减少他们却没有提及。而根据现阶段所掌握的资料来看tape library是ECMWF数据存储框架中一个较为底层的概念(参见这里),它似乎已经脱离应用层了,目前为止我还没搞明白机理。这有待进一步研究,根据官方的说法,对tape的调用次数可以严重影响队列权重,调用次数越多则in quequed的时间就越久。

关于程序中途退出的处理

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

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

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

joblist

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


四、常见问题解答(FAQ)

在我通读了气象家园的那篇帖子下面的全部回复以后,大概总结了以下几个案例:

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

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

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

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

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

排队是因为请求的人多,如果提示Request is queued,那说明它确实在排队,你又不能插队,只能等咯。有的人排队可以排好几个小时,我自己就排过2个小时以上。其实如果你等不及把程序关了,MARS后台还是会完成你的请求的,可以在joblist上查看,如果完成了可以直接从网站下载。