文章目录
前言
此系列博文的目的是基于Python的Climate Indices库计算标准化降水蒸散发(SPEI)指数。
1. 概述
此篇博文的目的是基于Climate Indices库中计算SPEI的函数,在一个站点上展开某一时间尺度的SPEI的计算。
2. 版本
2.1 山东青岛,2021年3月29日,Version1
2.2 山东青岛,2021年5月3日,Version2
(1)原始程序的第38行pet_mm=tas_data修改为pet_mm=pet_data。
3. 微信公众号GISRSGeography
- 公众号 GISRSGeography的内容涉及GIS,遥感和作物模型等的内容,会坚持更新,
欢迎大家关注,谢谢!。
一、climte indices库中的indices.spei()的输入和输出
- 关于climate indices库的用法介绍,可以参考climate_indices 1.08 Documents中的介绍。该文档对该库中各个气象指数调用时的基本参数进行了说明。
- 对于如何利用climate_indices库中的spei函数计算spei,我们可以打开下载的此包的源码,查看里面对于spei函数这一部分的定义。
- 以下是源码中对于spei函数的定义语句,通过其定义语句,我们可以知道在调用此库计算SPEI时需要输入的参数信息,关于这些参数的介绍,可以参考源码中的说明或者1中给出链接中的说明。以下对其进行简要说明:
- 输入参数简要说明
参数 | 含义 | 输入格式 |
---|---|---|
precips_mm | 降水(毫米) | numpy数组 |
pet_mm | 潜在蒸散发(毫米) | numpy数组 |
scale | 时间尺度 | 整型 |
distribution | 用于拟合时间序列的分布函数 | 字符串 |
periodicity | 计算的时间单元 | 字符串,‘monthly’或’daily’ |
data_start_year | 计算开始年 | 整型 |
calibration_year_initial | 校准期最初年份 | 整型 |
calibration_year_final | 校准期最后年份 | 整型 |
param fitting_params | 预先计算的分布拟合参数的可选字典 | 字典,通常使用默认值 |
- 输出数据
计算完成之后,函数的输出数据是就是特定时间尺度的SPEI,以浮点型的np.array的格式输出。
二、基于climate_indices库计算站点SPEI
1. 数据准备
计算spei的测试数据,我们选择SPEI提出者给出的测试数据tampa.txt,选择此数据的另一个好处是我们可以将基于climate indices库计算的spei和基于官方的spei.exe计算的spei进行对比。需要注意的是tampa.txt的存储格式是按照spei.exe计算时需要的格式存储的,所以下载完成之后,可以先将其进行预处理,转存到.csv文件中。
2. 站点特定尺度的spei的计算
在了解climate indices库中spei函数的基本用法之后,我们可以利用该库计算spei,由于我们利用的数据的内容是温度和降水,这里我们需要先依据桑斯维特方法计算潜在蒸散发(pet),可以再climate indices库中调用计算pet的函数直接计算pet。整个基于climate indices库计算特定时间尺度的spei的程序如下:
# -*- coding: utf-8 -*-
"""
1. 程序目的
(1) 基于climate indices库计算spei
2. 版本
2.1 山东青岛 2021年3月29日 Version 1
"""
# 相关包的导入
import numpy as np
import pandas as pd
from climate_indices import indices
from climate_indices import compute # 计算SPEI的包
# 路径处理和基本变量定义
rootdir = r'D:\SPEI_Cal\\';
tampa_file = rootdir + '01_Data\\tampa.csv'
outpath = rootdir + '03_Result\\'
lat = 27.96
styr = 1900
edyr = 2007
# 气象数据读取
tampa_data = pd.read_csv(tampa_file)
pre_data = np.asarray(tampa_data['Pre']) # 降水数据转换为np.array
tas_data = np.asarray(tampa_data['Tas']) # 温度数据转换为np.array
# 潜在蒸散发计算-桑斯维特方法
pet_data = indices.pet(temperature_celsius=tas_data,
latitude_degrees=lat,
data_start_year=styr)
# 计算SPEI
spei = indices.spei(precips_mm=pre_data,
pet_mm=pet_data, # pet_mm=tas_data是不正确的,
scale=3, # 3个月尺度
distribution=indices.Distribution.gamma,
periodicity=compute.Periodicity.monthly,
data_start_year=styr,
calibration_year_initial=styr,
calibration_year_final=edyr,
)
spei[np.isnan(spei)] = -99 # nan转换为-99
spei_df = pd.DataFrame(data=spei,columns=['SPEI_3']) # 计算结果转换为DataFrame
# 计算结果写出
spei_df.to_csv(outpath+'SPEI3.csv',index=False)
print('Finished.')
3. 和spei.exe计算结果的比较
通过比较基于spei.exe和基于climate indices库计算的spei可以看出两者存在着一定的差别,这可能是由于分布拟合参数上有一些区别导致的。