如何獲取ERA-Interim Reanalysis日降雨量數據

ERA-Interim數據的API下載請參考:https://blog.csdn.net/weixin_42924891/article/details/85225062

import linecache
from ecmwfapi import ECMWFDataServer
a = [31,28,31,30,31,30,31,31,30,31,30,31]
for i in range(2018,2019):#年份
    if i%4==0: # 判斷閏年
        m=29
    else:
        m=28
    for j in range(1,13):#月份1到12月
        if j==2:
            b = m
        else:
            b = a[j-1]
        if j<10:
            y1 = "0"+str(j)
        else:
            y1 = str(j)
        date = str(i)+"-"+y1+"-01/to/"+str(i)+"-"+y1+"-"+str(b) # 構造日期字符串
        print(date)
        server = ECMWFDataServer()
        try:
            server.retrieve({
            "class": "ei",
            "dataset": "interim",
            "area" : "26/99/24/100", # 下載區域
            "date": date,
            "expver": "1",
            "grid": "0.25/0.25", # 原始數據0.75°×0.75°,插值到了2.5°-0.125°此處選擇0.25°×0.25°
            "levtype": "sfc",
            "param": "228.128", # Total precipitation的參數編號228
            "step": "12", # 設置步長(step)
            "stream": "oper",
            "time": "00:00:00/12:00:00", #設置起始時間點 (time)
            "type": "fc", # 累積降雨是預報數據
            "format": "netcdf",        # 數據格式
            "target": "D:/down/"+str(i)+y1+".nc"  #輸出位置(左斜線)及文件名
            })
        except Exception as e:
            print(e)
print("all have done!")

此處注意,下載的數據爲time-time+step這個時間段的累計降雨量,0:00-12:00和12:00-24:00降雨量。剛好是一天的降雨,下面兩個時段的降雨量進行求和。涉及到多維數組直接轉化爲Dataframe數據結構。

# 導入模塊
from netCDF4 import Dataset

import itertools
import pandas as pd

from datetime import datetime 
from datetime import timedelta

df = None
for i in ['20180%d'%i if i<10 else '2018%d'%i for i in range(1,13)]:
    # 獲取數據集中所有變量名
    filename = r'D:\down\%s.nc'%i
    data = Dataset(filename)
#     variables_name = list(data.variables.keys())
#     print(variables_name)
    # 注意此處的減去3沒有具體含義,爲了讓數據重採樣落入同一天便於統計
    time = [datetime(1900, 1, 1,0,0,0) + timedelta(hours=int(i)-3) for i in data['time'][:]] 
    latitude = data['latitude'][:]
    longitude = data['longitude'][:]
    # 涉及到dataframe的MultiIndex
    data = pd.DataFrame(data['tp'][:].flatten(),index=pd.MultiIndex.from_product([time,latitude,longitude]))
    data = data.mean(level=[0]).resample('D').sum() # 整個45個經緯度點直接求均值,然後日內重採樣求和,此處經緯度可以根據需要採用更爲精細化的插值方式
    data = data
    if df is None :
        df = data
    else:
        df = pd.concat([df,data],axis=0)

df2 = df*1e3 # 原單位是metre 化爲mm

 

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