使用python下载欧洲中心ECMWF资料(多进程)

最近需要下载再分析资料,去EC网站上准备手动下载,但是他们的下载方式满足不了我的个性化需求,而且手动的确很麻烦。但是EC官网也给出了使用python进行下载的教程,于是按照他们的教程和前人的教程,成功了,这里做个分享(面对win用户)。

EC官网链接:https://www.ecmwf.int
下载东西的话,需要账号登陆。

  1. 前期准备
    官网教程: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用户,那就更简单了,官网教程已经很详细了。

  1. 下载数据

以我要下载的数据为例
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

  1. 更多示例

还是之前的官网,拉到最后
在这里插入图片描述
这里有很多例子,点开第三个,其实下载方式都差不多。
在这里插入图片描述

到此结束了,大家有没有学会呢?赶紧到手试试吧

参考链接:
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

  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值