使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章