批量下载气象数据(EC;NCEP;CMIP)

介绍如何使用python批量下载EC数据以及使用wget批量下载NCEP/NCAR以及CMIP资料。

1、使用python批量下载ECMWF数据(以EI数据为例)

​ 首先在EC官网注册账号并登录。

​ 点击进入EC公共数据集获取流程,根据提示进行以下的操作。

1. 安装ECMWF key

​ (Recommended) Save your API key credentials into a file

​ 将秘钥复制并保存为一个名为.ecmwfapirc的文件中。并将文件保存在根目录中。Linux的话直接输入

1
cd

​ 进入。

​ windows的话位于C:\Users<USERNAME>\下。注意,文件是无格式文件,文件名为.ecmwfapirc

​ 秘钥内容参考:

1
2
3
4
5
{
"url": "https://api.ecmwf.int/v1",
"email": "*********@***.com",
"key": "**************************"
}

​ (如果是linux,还可以通过声明环境变量的方式建立key。)

1
2
3
export ECMWF_API_URL="https://api.ecmwf.int/v1"
export ECMWF_API_KEY="*****************"
export ECMWF_API_EMAIL="**********@***.com"

​ 这个和建立.ecmwfapirc二选一即可(仅限linux)。

​ 再或者将以下内容包含在py脚本内(我使用的是第一种方法,建立好以后都不用再去管了,比较方便,迁移电 脑只需要拷贝秘钥文件即可)

1
server = ECMWFDataServer(url="https://api.ecmwf.int/v1",key="*******",email="******@****.com")
2. 安装依赖库
1
2
3
pip install ecmwf-api-client
#或者
conda install -c conda-forge ecmwf-api-client

​ 推荐第二种,使用conda统一管理最为方便,不会出现库混乱的情况。

​ 尝试

1
from ecmwfapi import ECMWFDataServer

​ 检查是否安装成功。

​ 完成这两步后,就可以开始批量下载数据了。

3. 下载数据

​ 回到数据集选择页面选择需要的数据集(这里以EI的daily资料为例),挑选变量和时间后选择

View data retrieval request

​ 就进入一个新页面,包含有下载选取数据的py代码。在本地新建一个py脚本,复制这些代码到本地脚本。然 后进行一些编辑即可。

4. 脚本语法

​ 脚本主要是以一个字典类型去设计的。初始提供了一些参数,还有一些其他的参数我们可以去额外添加,在这 里我补充完整以供参考。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python
from ecmwfapi import ECMWFDataServer
server = ECMWFDataServer()
server.retrieve({
"class": "ei",
"dataset": "interim",
"date": "19970101/19970201/19970301/19970401/19970501/19970601/19970701",
"expver": "1",
"grid": "1.0/1.0",
"levelist": "/200/500/700/850/1000",
"levtype": "pl",
"param": "129.128/130.128/131.128/132.128",
"stream": "moda",
"type": "an",
"area" : "90/-180/0/180",
"format" :"netcdf",
"target" : "1997levle.nc",
})

我们进行逐条的分析“class”: “ei”,”dataset”: “interim”表明是EI资料集;“date”表明了资料日期;“grid”表明水平分辨率;“levelist”代表层数;“levtype”代表高度类型,pl代表pressure level,sfc则是地面层等等;“param”为变量代码,“stream”为场的类型,moda代表monthly means of daily means月平均;“type”中an代表再分析,地面层有一些数据则是预测量,是不同于an的;“area”代表资料的范围,上/左/下/右 的顺序。最后两个一个是下载文件格式,一个是文件路径+文件名,默认是脚本路径。

弄清楚了代码含义,就可以进行修改,自定义自己想下载的数据了。尤其是关于时间部分,比如想下载1979-2018年的全部数据,那么就在整个脚本外层套一个循环,把日期和输出部分格式化替换,或者就是利用pandas,timedate等库建立一个对应格式的时间字符串即可。

而关于日数据在时间设置上更为方便,直接修改为19790101/to/20181231即可,月数据不能使用的原因是他只识别year+month+01

2、使用wget批量下载NCEP/NCAR等数据

Linux系统中的wget是一个下载文件的工具,它用在命令行下。Windows10用户想使用wget只需开启WSL功能即可。

NOAA提供了大量数据的下载,比如最常用的NCEP/NCAR Reanalysis 1数据集。

但是很多数据都被分为很多个文件(每年一个)来下载,一个一个点实在是麻烦,同时点很多又可能导致下载失败。仔细的话就会发现下载链接是有规律的。比如逐日位势高度资料

1
ftp://ftp2.psl.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/hgt.1948.nc

所有的都一样,唯独hgt.1948.nc的年份部分发生了区别。

进入bash,只需要最简单wget命令即可下载该文件:

1
wget ftp://ftp2.psl.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/hgt.1948.nc

这时,我们只需要设计一个循环,来使年份部分发生变化即可。

1
2
3
4
for (( i = 1948; i < 2020; i++))
do
wget ftp://ftp2.psl.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/hgt.${i}.nc
done

对于CMIP资料的下载也是同样的道理。前些日子被CMIP资料下载搞的有些崩溃,很多模式一个变量能分成几十上百个小文件,一个一个手点很不现实。最后就用类似的循环和索引实现了自动化的批量下载。