gma 教程 | 气候气象 | 计算标准化降水指数(SPI)

目标

【基于 Excel 降水和蒸散数据计算 SPI】
【基于 GTiff 栅格降水和蒸散数据计算 SPI】

环境

系统: Window 10+ (X64)
Python 版本: 3.8.8 +
gma 版本: 1.0.10 +

gma 安装和详细功能帮助见:地理与气象分析库

函数

gma.climet.SPI(PRE, Axis = None, Scale = 1, Periodicity = 12)


功能:【标准化降水指数】。基于 Gamma 分布计算标准化降水指数。

参数:

 PRE: array。降水量(mm)。

可选参数:

  Axis = int。计算轴。如果不设置(None),多维数据会将所有数据展开到一维计算。

  Scale = int。时间尺度。默认为 1。例如:1月、3月或其他。

  Periodicity = int。周期。默认为 12。例如:月数据可以以 12 为周期。

*注意:Scale、Periodicity 基于计算轴!

返回:array

参考文献:

 McKee T B, Doesken N J, Kleis J. The relationship of drought frequency and duration to time scales[R]. Eighth Conf. on Applied Climatology, Anaheim, CA: American Meteor Society, 1993.


示例

数据

  • 洛阳市辖区内某点 1981-2020 年月降水和蒸散数据(共 480 个月)
  • 洛阳市辖区1981-2020 年月降水量空间栅格数据(GTiff 格式)(含 1981-2020 对应月数据,共 480 个波段),由全国数据裁剪合并获取。

基于 Excel 表数据的 SPEI 计算

import gma
import pandas as pd
# 读取数据
Data = pd.read_excel('PRE_ET0.xlsx')

# 看一下 Excel 文件前 5 行内容
Data.head()
PREET0
15.253.4
7.266.9
34.5114.4
22.8144.1
3.7208.5
# 提取 PRE 用于 SPI 运算
PRE = Data['PRE'].values
# 分别计算1个月、3个月、6个月、12个月、24个月、60个月尺度的 SPI 数据
SPI1 = gma.climet.SPI(PRE)
SPI3 = gma.climet.SPI(PRE, Scale = 3)
SPI6 = gma.climet.SPI(PRE, Scale = 6)
SPI12 = gma.climet.SPI(PRE, Scale = 12)
SPI24 = gma.climet.SPI(PRE, Scale = 24)
SPI60 = gma.climet.SPI(PRE, Scale = 60)

绘图结果如下:(绘图代码参考:gma 教程 | 气候气象 | 计算标准化降水蒸散指数(SPEI)

在这里插入图片描述
将结果保存到文件

# 将结果保存到文件
OUT = pd.DataFrame([SPI1, SPI3, SPI6, SPI12, SPI24, SPI60],
                   index = ['SPI1','SPI3','SPI6','SPI12','SPI24','SPI60']).T
OUT.to_excel(r'.\SPI.xlsx', index = False)

基于 GTiff 栅格数据的 SPEI 计算

import numpy as np
# 读取数据集
PRESet = gma.Open('PRE_Luoyang_1981-2020.tif')
PRE = PRESet.ToArray()
PRE[PRE == PRESet.NoData] = np.nan
# 读取的数据为三维数据(波段,行,列),第一维为时间序列(月数据)。因此按照轴 0 来计算
SPI1 = gma.climet.SPI(PRE, Axis = 0)
SPI3 = gma.climet.SPI(PRE, Axis = 0, Scale = 3)
SPI6 = gma.climet.SPI(PRE, Axis = 0, Scale = 6)
SPI12 = gma.climet.SPI(PRE, Axis = 0, Scale = 12)
SPI24 = gma.climet.SPI(PRE, Axis = 0, Scale = 24)
SPI60 = gma.climet.SPI(PRE, Axis = 0, Scale = 60)

绘制最后一个月(2020年12月)计算结果

绘图方法请参考:基于 Python 的地理空间绘图指南

请添加图片描述
存储计算结果

# 存储计算结果
S = [1,3,6,12,24,60]
for i in S:
	# 保存所有结果中的非全 nan 波段。即:去除时间尺度累积时序列前无效的波段。
    gma.rasp.WriteRaster(fr'.\1981-2020_SPI{i}.tif', 
                         eval(f'SPI{i}')[i-1:], 
                         Projection = PRESet.Projection,
                         Transform = PRESet.GeoTransform, 
                         DataType = 'Float32', 
                         NoData = np.nan)  

反馈与讨论

微信号:Luo_Suppe

相关链接

地理与气象分析库

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛的地理研学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值