蒸散发计算:Hargreaves ET0 方程(公式、注意细节,python代码)
最近在使用日最高最低气温计算潜在蒸散发能力,从气温数据准备,到Hargreaves方程计算,也是几经波澜。写下这篇博客,一方面是为了记录,另外一方面也是想为正在做相关计算的你,减少一些无用功~
网上Hargreaves方程计算的教程基本都没写清楚,部分csdn下载包虽然收费,但那个代码真是一言难尽呀,代码混乱就算了,还没个清楚的说明文件,看的就很费劲。而且很多都是从GitHub上无脑复制过来,未经任何改动就直接拿来卖钱的。抄袭别人代码来卖钱,服务还做不好,嘴脸真是有够丑恶哈~
废话不说,咱直接开始 Hargreaves ET0 方程的介绍趴
Hargreaves ET0 方程计算公式
当太阳辐射、相对温度和(或)风速数据缺失时,或者说只有日最高最低气温时,可以选择使用Hargreaves ET0 方程来计算潜在蒸散发,其公式为
E
T
0
=
0.0023
(
T
m
e
a
n
+
17.8
)
(
T
m
a
x
+
T
m
i
n
)
0.5
R
a
ET_0 = 0.0023(T_{mean}+17.8)(T_{max}+T_{min})^{0.5}R_a
ET0=0.0023(Tmean+17.8)(Tmax+Tmin)0.5Ra
其中,
T
m
e
a
n
,
T
m
a
x
,
T
m
i
n
T_{mean},T_{max},T_{min}
Tmean,Tmax,Tmin分别为日平均气温、最高气温和最低气温,单位都为
C
°
C°
C°。其中
T
m
e
a
n
T_{mean}
Tmean如果没有小时气温数据来平均计算,可以用
T
m
e
a
n
=
(
T
m
a
x
+
T
m
i
n
)
/
2
T_{mean}=(T_{max}+T_{min})/2
Tmean=(Tmax+Tmin)/2来简化替代。
R
a
R_a
Ra是天顶辐射,单位是
m
m
d
a
y
−
1
mmday^{-1}
mmday−1(这个单位需要注意一下,我就是在这被卡了好久的(哭死~))。
下面来详细介绍天顶辐射
R
a
R_a
Ra的计算公式
R
a
=
24
×
60
π
G
s
c
d
r
[
w
s
s
i
n
(
φ
)
s
i
n
(
δ
)
+
c
o
s
(
φ
)
c
o
s
(
δ
)
s
i
n
(
w
s
)
]
R_a = \frac{24×60}{\pi}G_{sc}d_r[w_ssin(\varphi)sin(\delta)+cos(\varphi)cos(\delta)sin(w_s)]
Ra=π24×60Gscdr[wssin(φ)sin(δ)+cos(φ)cos(δ)sin(ws)]
公式中
R
a
R_a
Ra单位为
M
J
m
−
2
d
a
y
−
1
MJm^{-2}day^{-1}
MJm−2day−1,注意这里单位和Hargreaves 方程里
R
a
(
m
m
d
a
y
−
1
)
R_a(mmday^{-1})
Ra(mmday−1)的单位不一样。
G
s
c
G_{sc}
Gsc为太阳常数为0.0820
(
M
J
m
−
2
m
i
n
−
1
)
(MJm^{-2} min^{-1})
(MJm−2min−1)
d
r
d_r
dr为日地间相对距离的倒数
w
s
w_s
ws为太阳时角(rad)
φ
\varphi
φ为地理纬度(rad)
δ
\delta
δ为太阳磁偏角(rad)
下面分辨介绍
φ
,
d
r
,
δ
,
w
s
\varphi, d_r, \delta, w_s
φ,dr,δ,ws的具体计算公式
首先
φ
\varphi
φ
φ
=
π
180
×
[
十进制度数纬度
]
\varphi = \frac{\pi}{180}×[十进制度数纬度]
φ=180π×[十进制度数纬度]
为防止理解错,这里给了个例子~
日地间相对距离的倒数
d
r
d_r
dr 和太阳磁偏角
δ
\delta
δ的计算见下式:
d
r
=
1
+
0.033
c
o
s
(
2
π
365
J
)
d_r= 1 + 0.033cos(\frac{2\pi}{365}J)
dr=1+0.033cos(3652πJ)
δ
=
0.409
s
i
n
(
2
π
365
J
−
1.39
)
\delta= 0.409sin(\frac{2\pi}{365}J-1.39)
δ=0.409sin(3652πJ−1.39)
公式中:
J
J
J是年内某天的日序数,在 1( 1 月 1 日)至 365 或 366( 12 月 31 日)之间。
日落时角
w
s
w_s
ws 见下式:
w
s
=
a
r
c
c
o
s
[
−
t
a
n
(
φ
)
t
a
n
(
δ
)
]
w_s= arccos[-tan(\varphi)tan(\delta)]
ws=arccos[−tan(φ)tan(δ)]
在算法语言里没有反余弦函数,所以日落时角
ω
s
ω_s
ωs 亦可用反正切函数计算:
w
s
=
π
2
−
a
r
c
t
a
n
[
−
t
a
n
(
φ
)
t
a
n
(
δ
)
X
0.5
]
w_s= \frac{\pi}{2}-arctan[ \frac{-tan(\varphi)tan(\delta)}{X^{0.5}}]
ws=2π−arctan[X0.5−tan(φ)tan(δ)]
其中:
X
=
1
−
[
t
a
n
(
φ
)
]
2
[
t
a
n
(
δ
)
]
2
X = 1− [tan(\varphi)]^2[tan(\delta )]^2
X=1−[tan(φ)]2[tan(δ)]2
当
X
≤
0
X\leq0
X≤0时,
X
=
0.00001
X=0.00001
X=0.00001
因为公式Hargreaves 方程里
R
a
R_a
Ra单位为
m
m
d
a
y
−
1
mmday^{-1}
mmday−1,所以需要把
R
a
(
M
J
m
−
2
d
a
y
−
1
)
R_a(MJm^{-2}day^{-1})
Ra(MJm−2day−1)转换成
R
a
(
m
m
d
a
y
−
1
)
R_a(mmday^{-1})
Ra(mmday−1)。具体转换如下:
R
a
(
m
m
d
a
y
−
1
)
=
0.408
×
R
a
(
M
J
m
−
2
d
a
y
−
1
)
R_a(mmday^{-1}) = 0.408×R_a(MJm^{-2}day^{-1})
Ra(mmday−1)=0.408×Ra(MJm−2day−1)
Hargreaves ET0 python代码
这里给了我的Hargreaves方程代码。因为这是适应我的数据的代码,利用插值后的站点气温数据(2922,140,230)(时间,纬度,经度)计算南方[99°E~122°E, 21°N ~ 35°N]地区0.1°分辨率的蒸散发能力
在你们的程序上,应该不能直接运行。不过我给了详尽的注释,希望能给你们带来一些帮助。
先
R
a
R_a
Ra 的计算
## 计算天顶辐射Ra
import h5py
import numpy as np
import pandas as pd
import math #导入包
with h5py.File('temperature_daily.h5', 'r') as file:
lons = file['longitude'][:]
lats = file['latitude'][:]
#导入进度纬度文件lons是[140]的一维数组,lats是[230]的一维数组
j=np.array(range(1,366),dtype=np.int32)
for ii in range(2016,2023):
if ii % 4 == 0:
mid = np.array(range(1,367),dtype=np.int32)
j = np.hstack([j, mid])
else:
mid = np.array(range(1,366),dtype=np.int32)
j = np.hstack([j, mid])
del mid # j 年内某天的日序数。把2015年到2022年的日序数都给标好,赋给j变量
hudu = np.empty((lats.shape[0],lons.shape[0]), dtype=np.float32)
for ii in range(lats.shape[0]):
hudu[ii,:] = lats[ii]*math.pi/180 #hudu是φ 地理纬度,(140,230)
dr = np.empty((lats.shape[0],lons.shape[0]), dtype=np.float32) #dr 日地间相对距离的倒数
fi = np.empty((lats.shape[0],lons.shape[0]), dtype=np.float32) #fi 是 δ 太阳磁偏角
Ra = np.empty((2922,lats.shape[0],lons.shape[0]), dtype=np.float32) # Ra 是天顶辐射
for jj in range(2922):
dr[:,:] = 1+0.033*math.cos(2*math.pi*j[jj]/365)
fi[:,:] = 0.409*math.sin(2*math.pi*j[jj]/365-1.39)
x = 1-np.tan(hudu)**2*np.tan(fi)**2
x = np.where(x<=0, 0.00001, x)
ws = math.pi/2-np.arctan((-np.tan(hudu))*np.tan(fi)/(x**0.5))
Ra[jj,:,:] = (
24*60/math.pi*0.082*dr*
(ws*np.sin(fi)*np.sin(hudu)+np.cos(hudu)*np.cos(fi)*np.sin(ws))
)*0.408
with h5py.File('Ra.h5', 'w') as h5file:
h5file.create_dataset('Ra', data=Ra)
h5file.create_dataset('longitude', data=lons)
h5file.create_dataset('latitude', data=lats)
h5file.attrs['Description'] = 'ra 2015~2022' #保存变量至HDF5文件
再计算ET0
import h5py
import numpy as np
import pandas as pd
import math #导入包
with h5py.File('temperature_daily.h5', 'r') as file:
temperature_max = file['temperature_max'][:]
temperature_min = file['temperature_min'][:]
temperature_mean = file['station_temputure_mean'][:] #导入气温数据都是(2922,140,230)的数组
with h5py.File('Ra.h5', 'r') as file:
Ra = file['Ra'][:] #导入气温 (2922,140,230)
et = 0.0023*(temperature_mean+17.8)*((temperature_max-temperature_min)**0.5)*Ra #ET0计算
with h5py.File('Ra.h5', 'a') as h5file:
h5file.create_dataset('ET0', data=et) #保存至 HDF5文件
基本表现
多年空间平均
时间序列平均
参考
FAO Irrigation and Drainage Paper
https://blog.csdn.net/weixin_51956867/article/details/136112272?fromshare=blogdetail&sharetype=blogdetail&sharerId=136112272&sharerefer=PC&sharesource=m0_46211544&sharefrom=from_link