批量EC數據下載


前言

包含氣象家園個人博客的精華內容

  1. 准備&配置
  2. 正確地獲取腳本和參數
  3. 下載策略及注意事項
  4. 常見問題解答(FAQ

這四部主要針對三類不同人群:

  1. 如果你完全沒有看過關於批量下載ECMWF數據的文章,那么我建議你從第1部分開始看。
  2. 如果你看了相關的文章並且已經成功完成了配置工作,那么請從第2部分開始看。
  3. 如果你前兩部分都已經實踐過了,但是遇到了一些麻煩,例如程序崩潰了不知道原因,找不到某個文件夾之類的,那么請直接從第4部分開始看。(沒錯我說的就是氣象家園那篇帖子里各種提問以及聲稱“我遇到了相同問題”的朋友們)

一、准備&配置

想要獲取ECMWF的公開數據首先需要在網站注冊一個賬號,以前我注冊那會兒需要FQ才能注冊成功,現在似乎不需要了。值得注意的是,你的EC賬戶是不能自定義密碼的,你的密碼是EC通過郵件的方式給你分配的,所以建議你在Chrome中自動保存密碼。注冊完並且登錄賬戶以后,點開這個網址,然后瀏覽器會在新的標簽頁上顯示如下的內容。


API-Key信息頁面

配置

  • macOS和Linux系統:你需要把灰色方框里面的內容復制粘貼到一個名叫.ecmwfapirc的文本文件里(推薦使用Sublime Text文本編輯器),並且該文件要放在目錄(Linux的是/home/,macOS是~/Users/ /)下。

  • Windows:,你可以打開一個空白的記事本,把花括號的內容復制粘貼過去,然后保存到你cmd命令行初始的路徑。

確保pip已安裝的情況下,我們開始安裝ecmwfapi。

在Windows系統中,cmd執行

  • # have admin privilege 
    pip install ecmwf-api-client
    # have not
    pip install --user ecmwf-api-client
    
    # or
    conda install -c conda-forge ecmwf-api-client
    

在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
    

完成以后可以在終端檢驗一下是否安裝成功。

  • - \>>> from ecmwfapi import ECMWFDataServer
    - \>>>
    

二、批量下載

要下載ECMWF的數據,就繞不開MARS,它是Meteorological Archival and Retrieval System的簡稱,可以把它理解成一個類似於數據庫的數據管理系統。MARS有自己語法,純MARS用戶可以直接使用MARS命令去調取數據,然而這只是內部人員或者商業合作伙伴(花了錢的那種)才有的特權,可能是出於安全和管理的考慮,公共用戶無權直接使用MARS命令,需要使用MARS的API去調用MARS。

這就好比是你想找某人幫你個忙,你提出面談,但是他覺得你倆不熟,只讓你用微信跟他聊。直接使用MARS語法就相當於是面談,而使用MARS API就相當於是微信聯系。

ECMWF的公開數據庫包含有多個數據集,這些數據集的開放政策是不一樣的,有些數據集的開放權限是沒有條款限制的,有些卻需要你接受他們的一些政策條款才能獲得下載許可權,你可以在這里查看這些數據集的開放政策。其中除了Licence為general以外的數據集(general是完全公開,默認為Accepted),都需要你手動點開並點擊Accept的,否則你在使用腳本下載該數據集的數據的時候會報錯,所以我建議你上來就把它們一口氣全部Accept了,省得以后麻煩。

保證了數據集的可用性,下面就是要開始建立腳本了。建立腳本非常的簡單,先到這里找到你想要檢索數據的數據集。

選擇數據集

以ERA-Interim為例,進入MARS的Web-API,你可以在這里面根據需要選擇你關注的參數,時間參數只能單選,就隨便選一個時間就行,后面在腳本里修改。選擇完成后把頁面拉到最下面,點View the MARS request

在之后彈出的頁面里,ECMWF就給我們把Python下載的腳本寫好了。

在此基礎上,批量下載的兩種方法

  • 修改 "date": "1989-01-01/to/2017-12-31",

  • for iyear in range(1989, 2018):  # 
        for imonth in range(1, 13):
            st = '{:4}-{:0>2}-01/to/{:4}-{:0>2}-31'.format(iyear, imonth,iyear,imonth)
            server.retrieve({
            	...
                "date": st,
                ...
            })
    

查看服務器隊列

這里(請先登錄)

關於參數的編碼問題

我們可以看到,腳本里有"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會缺失(比如當前這個例子),但是還是有很多變量它會給你一些簡短的介紹,讓你對這個變量有一個了解。


三、下載策略和注意事項

下載量比較大的情況,在遠程服務器上掛后台運行。具體命令是

  • nohup python example_download.py &

關於如何提高檢索效率的問題,根據官方給出的建議

關於程序中途退出的處理

有時候我們可能數據請求已經提交了,結果因為網絡問題、關閉終端或者其他什么原因導致本地程序中斷了。這時候不要慌,因為你本地的程序雖然中斷了,但是ECMWF服務器上MARS的程序還在跑(pai)着(dui)呢。你不要重復提交,否則可能會被增加延遲權重,增加等待時間。

這個時候正確的處理姿勢是到這里(請先登錄)來查看自己joblist,對於你的每一次成功提交,ECMWF都會處理到最終結果,除非是失敗提交(如權限不夠,參數不存在等)會顯示aborted。你可以在這里下載之前提交請求后處理出來(未成功下載過)的結果,就像下圖中所示。一旦你成功下載過一次,ECMWF就會從服務器中把該下載鏈接移除,並在download下面寫上expired。

注意,這里說的是成功下載,也就是說假如你點擊那個download鏈接下載到一半突然電腦的WiFi斷了,下載失敗,在你重新連上WiFi以后這個download依然可用,直到你確確實實把文件完整下載到本地以后,這個鏈接才會失效。

其實如果你只用Python進行submit,然后每次都到joblist里點擊鏈接下載也未嘗不可,畢竟對有些人來說可能看網頁會更親切一些。


四、常見問題解答(FAQ)

總結了以下幾個案例:

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

這位同學之所以遇到這個問題,是因為TA不太了解Python的包管理機制。樓主的方法是直接下載源碼,然后在源碼的同級目錄下進行操作,而這位同學是用pip安裝的模塊包,這種情況下包的源碼路徑是由pip進行管理的,你根本不需要知道它在哪。用pip安裝是不需要受同級目錄限制的,因此這位同學其實根本不需要也不應該完全按照樓主的步驟找到這個文件夾,把腳本放在任何目錄下都可以順利運行。

案例二:提交不具備數據集權限的請求

這位同學問這個問題顯然是沒有看錯誤提示,錯誤提示里寫了你沒有獲取tigge數據集的權限,需要你去Accept一下條款。所以請到這里Accept一下。同時建議到這里把所有數據集全部Accept一下,省去不必要的麻煩。

案例三:為什么一直在排隊?是不是有什么問題?

排隊是因為請求的人多,如果提示Request is queued,那說明它確實在排隊。其實如果你等不及把程序關了,MARS后台還是會完成你的請求的,可以在joblist上查看,如果完成了可以直接從網站下載。

延伸閱讀:

Access ECMWF Public Datasets

MARS user documentation

MARS Intro

Retrieval efficiency

Reference

http://www.clarmy.net/2018/09/16/how-to-download-data-from-ecmwf-in-batch/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM