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