Python——基于ERA5数据的饱和水汽压差(VPD)批量计算(Clausius-Clapeyron 克劳修斯-克拉伯龙关系)

一、前言

之前我发布过基于CRU数据和Goff-Gratch公式计算VPD的博客,见下方:

基于CRU数据计算VPD的博客

但是,CRU数据的分辨率还是较为粗糙(0.5°×0.5°),而ERA5 land数据集分辨率能很好地满足我的需求(0.1°×0.1°)。但是,ERA5 land数据集并不提供水汽压和湿度变量供于下载,这导致利用Goff-Gratch公式很难进行计算。

结合近期文献阅读和整理,这里提供另一种既具权威性也易操作的方法供大家参考。

(注:这里所指的权威性主要指使用该方法的期刊等级和被引量,具体见文末)


二、定义

饱和水汽压差(Vapor Pressure Deficit,简称VPD) 是指在一定温度下,饱和水汽压与空气中的实际水汽压之间的差值。VPD对于植被生理状态具有重要影响。

简言之,VPD = 饱和水汽压 - 实际水汽压


三、计算方法

(一)公式

Clausius-Clapeyron是一个数学公式,用来描述气体或蒸气的压力和温度之间的关系,其表现形式如下,具体不作赘述。此方程不是我们最终计算的方程,而是水汽压和温度间关系的理论框架

Clausius-Clapeyron方程

基于Clausius-Clapeyron方程的理论框架以及大量的实验数据,最终学术界得到一种经验性的用以计算特定温度下水汽压的公式,即August-Roche-Magnus马格努斯方程

通常来说,只使用T>0℃情景的方程(图上红框),除非你需要研究冰面上的气压情况。

但正如上面说的,Magnus方程是基于经验性的,其参数网上有很多不同版本(最为困扰的一点)

读者当然可以使用上图中的方程计算,我这里使用另一个参数版本,原因是其被《SCIENCE ADVANCES》引用过,我就姑且信其所然(出了问题找他吧哈哈)。公式如下:

局限性:我目前暂无法评估不同参数得到结果的可靠性差异,希望有了解的同僚给予指正。

(二)数据

ERA5 land 2m temperature 地表温度数据     

ERA5 land 2m dewpoint temperature 地表露点温度数据

下载地址:ERA5 land数据集下载地址

注:原数据是开尔文单位,需要转换为摄氏单位。


三、Python脚本

import os
import numpy as np
from osgeo import gdal

# Magnus公式的计算函数
def Magnus(t_celsius):
    return 0.611 * np.exp((17.5 * t_celsius) / (t_celsius + 240.978))
def process_tif(input_path, output_path):
    # 打开输入TIFF文件
    ds = gdal.Open(input_path)
    band = ds.GetRasterBand(1)
    temp_data = band.ReadAsArray()

    # 将温度从开尔文转换为摄氏度
    temp_celsius = temp_data - 273.15

    # 计算饱和水汽压
    es = Magnus(temp_celsius)

    # 创建输出TIFF文件
    driver = gdal.GetDriverByName('GTiff')
    out_ds = driver.Create(output_path, ds.RasterXSize, ds.RasterYSize, 1, gdal.GDT_Float32)
    out_ds.SetGeoTransform(ds.GetGeoTransform())
    out_ds.SetProjection(ds.GetProjection())

    # 写入数据到输出文件
    out_band = out_ds.GetRasterBand(1)
    out_band.WriteArray(es)
    out_band.SetNoDataValue(-9999)
    out_band.FlushCache()

    # 关闭数据集
    del ds
    del out_ds

def main(input_folder, output_folder):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    for file_name in os.listdir(input_folder):
        if file_name.endswith('.tif'):
            input_path = os.path.join(input_folder, file_name)
            output_path = os.path.join(output_folder, f"es_{file_name}")
            process_tif(input_path, output_path)
            print(f"Processed {file_name}")

if __name__ == "__main__":
    input_folder = r'输入文件夹路径'  
    output_folder = r'输出文件夹路径' 
    main(input_folder, output_folder)

结果:

可以看到二者结果相差不大,但是分辨率提升明显,预期目的基本达到。

重要事项:

① 提供的代码是用于计算实际水汽压(或饱和水汽压),而非VPD,VPD还需二者做差

露点温度对应实际水汽压,地表温度对应饱和水汽压!!!


参考:

[1] Z.Q. Zhong, B. He, Y.P. Wang, et al, Disentangling the effects of vapor pressure deficit on northern terrestrial vegetation productivity.Sci. Adv.9,eadf3166(2023).

[2] A. Barkhordarian, K.W.Bowman, N.Cressie,et al, Emergent constraintson tropical atmospheric aridity—Carbon feedbacks andthefutureofcarbon sequestration. Environ. Res.Lett. 16,114008 (2021).

[3] D. Zhao, Z. Zhang, Y. Zhang, Soil moisture dominates the forest dominates the forest productivity decline during the 2022 China compound drought-heatwave event. Geophysical Research Letters, e2023GL104539(2023).

好的,下面是一份完整的 Python 代码,用于基于传统机器学习算法估算FR-Pue站点的潜热通量特征选择并画散点图。本示例使用的机器学习算法是随机森林。 ``` import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split from sklearn.metrics import r2_score, mean_squared_error # 加载数据集 data = pd.read_csv("FLX_FR-Pue_FLUXNET2015_FULLSET_HH_2000-2014_2-4.csv") # 删除无关变量 data = data.drop(['TIMESTAMP_START', 'TIMESTAMP_END', 'RECORD', 'USTAR', 'H', 'NETRAD', 'TA_F', 'PA_F', 'VPD_F', 'SWC_F_MDS', 'RNET', 'GPP_NT_VUT_REF', 'NEE_VUT_REF', 'FC_F_MDS', 'SFC_F_MDS', 'TA_F_MDS', 'PA_F_MDS', 'P_F_MDS', 'WS_F_MDS', 'USTAR', 'TSTAR', 'SW_IN_F_MDS', 'SW_OUT_F_MDS', 'LW_IN_F_MDS', 'LW_OUT_F_MDS', 'SWC_F_MDS_1', 'SWC_F_MDS_2', 'USTAR', 'WD', 'WS', 'USTAR', 'ZL', 'SWC_F_MDS_3', 'SWC_F_MDS_4'], axis=1) # 提取目标变量 target = data['LE_F_MDS'] data = data.drop(['LE_F_MDS'], axis=1) # 特征选择 rf = RandomForestRegressor(random_state=42) rf.fit(data, target) importances = rf.feature_importances_ indices = np.argsort(importances)[::-1] features = data.columns[indices][:4] print("Selected features:", features) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(data[features], target, test_size=0.2, random_state=42) # 随机森林模型训练 rf = RandomForestRegressor(random_state=42) rf.fit(X_train, y_train) # 模型预测 y_pred = rf.predict(X_test) # 计算模型评估指标 print("R-squared score:", r2_score(y_test, y_pred)) print("Mean squared error:", mean_squared_error(y_test, y_pred)) # 绘制散点图 plt.scatter(y_test, y_pred) plt.xlabel('True Values') plt.ylabel('Predictions') plt.title('FR-Pue Site LE_F_MDS Prediction') plt.show() ``` 这份代码会输出特征选择结果、模型评估指标以及散点图。您可以根据实际情况对代码进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值