最近需要下载再分析资料,去EC网站上准备手动下载,但是他们的下载方式满足不了我的个性化需求,而且手动的确很麻烦。但是EC官网也给出了使用python进行下载的教程,于是按照他们的教程和前人的教程,成功了,这里做个分享(面对win用户)。
EC官网链接:https://www.ecmwf.int
下载东西的话,需要账号登陆。
- 前期准备
官网教程:https://confluence.ecmwf.int//display/WEBAPI/Access+ECMWF+Public+Datasets
按照他给出的教程,一步一步来
1.1 获取key,并保存到相应文件中
获取key的网址:https://api.ecmwf.int/v1/key/ 前提是得先登录
进去之后,就能看到这个东西,
这个时候,新建一个文件名为 .ecmwfapirc. 的文件,把上面 大括号及其大括号里面的东西 全部复制,写到刚刚创建的文件里面去。
注意,上述文件名没有后缀, 前后都有两个. 。可能有同学觉得win下没有办法创建这样的文件,这个教程网上可以搜到。我的解决办法:在win下,下载一个git ,然后就可以像linux一样,查找,修改电脑上的文件,创建文件和写文件当然也不在话下。
后面将写进了key内容的文件,放到你的 C:\users<username>.ecmwfapirc 这个目录下。第一步就OK了
1.2 安装 ecmwf-api-client
现在python2都不再维护了,用python3才是正道啊。我估计大家有Anaconda较多,打开终端,直接
pip install ecmwf-api-client
一次性通过,安装成功。如果你安装失败,也没有关系,
可以先去官网下载这个包,然后再自己手动安装,也是使用pip安装
https://pypi.org/project/ecmwf-api-client/ 这是下载链接
如果是linux用户,那就更简单了,官网教程已经很详细了。
- 下载数据
以我要下载的数据为例
https://www.ecmwf.int/en/forecasts/datasets/browse-reanalysis-datasets
我要下载 ERA-Interim,进去之后,如下图所示。
以下载Pressure levels数据为例,拉到最下面,
点击 View data retrieval request,就可以看到python脚本了。
到这一步,我们就可以根据脚本,进行个性化的修改了。下面我们来讲讲仔细讲讲怎么改
#!/usr/bin/env python
#这个库刚刚已经安装过了
from ecmwfapi import ECMWFDataServer
server = ECMWFDataServer()
server.retrieve({
"class": "ei",
"dataset": "interim",
"date": "2017-06-01/to/2017-06-30", #要下载的数据的时间范围。可以根据需求随意修改
"expver": "1",
"grid": "0.75/0.75", #网格分辨率,可以更改,如下图。可以改成 0.125/0/125
"levelist": "1/2/3/5/7/10/20/30/50/70/100/125/150/175/200/225/250/300/350/400/450/500/550/600/650/700/750/775/800/825/850/875/900/925/950/975/1000", #气压层,可去掉自己不想要的层
"levtype": "pl",
"param": "60.128/129.128/130.128/131.128/132.128/133.128/135.128/138.128/155.128/157.128/203.128/246.128/247.128/248.128",
"step": "0",
"stream": "oper",
"time": "00:00:00/06:00:00/12:00:00/18:00:00", #一天4个时次
"type": "an", #数据类型为 再分析资料
"target": "output", #下载的数据的保存目录和文件名,如果是.nc资料,一定要写成 ***.nc格式
“format”: "netcdf" , #可选nc和grib格式
"area": "90/-180/-90/180" "可选的经纬度范围,按照下面图中的格式来就好"
})
下面正式进行下载了:
#!/usr/bin/env python
from ecmwfapi import ECMWFDataServer
server = ECMWFDataServer()
#我要下载某些离散天的数据,
date_list = ['2017-06-16/to/2017-06-17',
'2017-05-11/to/2017-05-12',
'2017-05-10/to/2017-05-11',
'2015-07-27/to/2015-07-28',
'2015-07-26/to/2015-07-27',
'2015-06-08/to/2015-06-09',
'2012-06-11/to/2012-06-12',
'2010-07-16/to/2010-07-17',
'2009-06-24/to/2009-06-25',
'2008-06-19/to/2008-06-20',
'2008-05-16/to/2008-05-17',
'2007-06-22/to/2007-06-23']
for date in date_list[0:]:
#确定filename
filename = date.split('/')[0]+'_'+date.split('/')[-1] #保存为如 2007-06-22_2007-06-23.nc格式
server.retrieve({
"class": "ei",
"dataset": "interim",
"date": date,
"expver": "1",
"grid": "0.125/0.125", #分辨率
"levelist": "1/2/3/5/7/10/20/30/50/70/100/125/150/175/200/225/250/300/350/400/450/500/550/600/650/700/750/775/800/825/850/875/900/925/950/975/1000",
"levtype": "pl",
"param": "60.128/129.128/130.128/131.128/132.128/133.128/135.128/138.128/155.128/157.128/203.128/246.128/247.128/248.128",
"step": "0",
"stream": "oper",
"time": "00:00:00/06:00:00/12:00:00/18:00:00",
"area": "50/117/40/127", #经纬度范围为东北地区
"type": "an",
"target": "F:/ERAInterim/"+filename+".nc", #保存的文件名
"format": "netcdf"
})
下载结果如下。
如果下载数据很多的话,可以尝试使用多进程同时下载。还是以上面的下载为例子,同时开启四个进程。
from ecmwfapi import ECMWFDataServer
import multiprocessing
import time
date_list = ['2017-06-16/to/2017-06-17',
'2017-05-11/to/2017-05-12',
'2017-05-10/to/2017-05-11',
'2015-07-27/to/2015-07-28',
'2015-07-26/to/2015-07-27',
'2015-06-08/to/2015-06-09',
'2012-06-11/to/2012-06-12',
'2010-07-16/to/2010-07-17',
'2009-06-24/to/2009-06-25',
'2008-06-19/to/2008-06-20',
'2008-05-16/to/2008-05-17',
'2007-06-22/to/2007-06-23']
def get_EC_data(date):
server = ECMWFDataServer()
#确定filename
filename = date.split('/')[0]+'_'+date.split('/')[-1]
server.retrieve({
"class": "ei",
"dataset": "interim",
"date": date,
"expver": "1",
"grid": "0.125/0.125",
"levelist": "1/2/3/5/7/10/20/30/50/70/100/125/150/175/200/225/250/300/350/400/450/500/550/600/650/700/750/775/800/825/850/875/900/925/950/975/1000",
"levtype": "pl",
"param": "60.128/129.128/130.128/131.128/132.128/133.128/135.128/138.128/155.128/157.128/203.128/246.128/247.128/248.128",
"step": "0",
"stream": "oper",
"time": "00:00:00/06:00:00/12:00:00/18:00:00",
"area": "50/117/40/127",
"type": "an",
"target": "F:/ERAInterim/"+filename+".nc",
"format": "netcdf"
})
if __name__ == "__main__":
start=time.time()
pool = multiprocessing.Pool(processes=4) # 通过Pool创建4个进程,如果电脑CPU多,可以开启更多进程
for i in range(len(date_list)):
pool.apply_async(get_EC_data, (date_list[i], )) #传递函数,和函数参数,函数参数用元组表示
pool.close() # 关闭进程池,表示不能在往进程池中添加进程
pool.join() # 等待进程池中的所有进程执行完毕,必须在close()之后调用
print('total cost time:', time.time()-start)
开启4个进程,就可以一份时间,下载4份数据了。一般的笔记本完全可以可以开启4的整数倍的进程数。
多进程方法,可以参考我之前的博客:https://blog.csdn.net/weixin_43718675/article/details/97695227
- 更多示例
还是之前的官网,拉到最后
这里有很多例子,点开第三个,其实下载方式都差不多。
到此结束了,大家有没有学会呢?赶紧到手试试吧
参考链接:
https://blog.csdn.net/zhanglinqi_007/article/details/79056682
https://blog.csdn.net/XinemaChen/article/details/82934094
https://blog.csdn.net/CronousGT/article/details/78322369