用Python和gma库搞定气象干旱分析:从Excel表格到GeoTiff栅格的SPI计算全流程

张开发
2026/4/20 14:28:01 15 分钟阅读

分享文章

用Python和gma库搞定气象干旱分析:从Excel表格到GeoTiff栅格的SPI计算全流程
Python与gma库实战气象干旱分析的SPI计算全流程解析干旱监测是气候研究中的重要课题而标准化降水指数(SPI)作为国际通用的干旱评估指标其计算过程往往让初学者望而生畏。本文将带你用Python的gma库从Excel表格和GeoTiff栅格两种数据源出发完整实现SPI计算的工作流。不同于简单的函数调用演示我们会深入探讨数据预处理、多时间尺度计算、结果可视化等实际工作中的关键环节特别适合从事农业气象、生态水文研究的专业人士。1. 环境配置与数据准备在开始计算前需要确保Python环境已安装必要的库。推荐使用conda创建专用环境conda create -n spi_analysis python3.8 conda activate spi_analysis pip install gma pandas numpy rasterio matplotlib数据准备阶段需要特别注意两种常见数据格式的处理差异Excel表格数据通常包含站点观测的降水时间序列结构简单但可能包含缺失值GeoTiff栅格数据多为卫星或模型输出的空间分布数据具有地理参考信息但维度复杂示例数据目录结构建议如下/spi_project /input precipitation.xlsx # Excel格式降水数据 monthly_pre.tif # 栅格格式降水数据 /output # 结果保存目录 /scripts # 分析代码提示无论哪种数据源都应检查数据的时间连续性和完整性。实际项目中约70%的时间会花费在数据质量检查上。2. Excel数据SPI计算实战对于存储在Excel中的站点降水数据我们采用pandas进行读取和处理。以下是完整的操作流程import gma import pandas as pd import matplotlib.pyplot as plt # 数据读取与预览 df pd.read_excel(input/precipitation.xlsx) print(df.head()) # 检查前五行数据 # 处理缺失值常见于实际观测数据 precipitation df[precip].fillna(methodffill).values # 计算不同时间尺度的SPI spi_configs [ {name: SPI-1, scale: 1}, {name: SPI-3, scale: 3}, {name: SPI-6, scale: 6}, {name: SPI-12, scale: 12} ] results {} for config in spi_configs: results[config[name]] gma.climet.SPI( precipitation, Scaleconfig[scale] )关键参数解析Scale参数决定累积降水的时间窗口直接影响干旱识别的敏感性计算结果为标准化值SPI-2表示极端干旱SPI2表示极端湿润将结果可视化并保存# 创建多子图对比 fig, axes plt.subplots(4, 1, figsize(12, 8)) for idx, (name, spi) in enumerate(results.items()): axes[idx].plot(spi, labelname) axes[idx].axhline(-1, colorr, linestyle--) # 干旱阈值线 axes[idx].legend() plt.tight_layout() plt.savefig(output/spi_timeseries.png) # 保存计算结果 result_df pd.DataFrame(results) result_df.to_excel(output/spi_results.xlsx, indexFalse)3. 栅格数据SPI计算进阶处理空间栅格数据时需要考虑数据的多维特性时间、空间维度和地理参考信息。以下是典型的工作流程import numpy as np from osgeo import gdal # 读取栅格数据集 pre_dataset gma.Open(input/monthly_pre.tif) pre_data pre_dataset.ToArray() # 处理NoData值 no_data pre_dataset.NoData pre_data[pre_data no_data] np.nan # 检查数据维度 (bands, rows, cols) print(f数据形状{pre_data.shape}) # 计算多尺度SPI沿时间轴计算 spi_scales { SPI1: {Axis: 0, Scale: 1}, SPI3: {Axis: 0, Scale: 3}, SPI6: {Axis: 0, Scale: 6} } spi_results {} for name, params in spi_scales.items(): spi_results[name] gma.climet.SPI(pre_data, **params)栅格处理技巧使用Axis0指定沿时间维度计算累积尺度(Scale)越大结果数据有效部分越少前N-1个时段无法计算空间数据计算量较大建议先在小区域测试保存计算结果为GeoTiff# 获取原始数据的地理参考信息 geo_transform pre_dataset.GeoTransform projection pre_dataset.Projection # 保存SPI结果 for name, data in spi_results.items(): # 跳过无效的前N-1个时段 valid_data data[spi_scales[name][Scale]-1:] gma.rasp.WriteRaster( foutput/{name}.tif, valid_data, Projectionprojection, Transformgeo_transform, DataTypeFloat32, NoDatanp.nan )4. 结果分析与可视化优化获得SPI计算结果后科学解读是关键。我们可以从时间和空间两个维度进行分析。时间序列分析示例代码# 提取特定位置的时间序列 row, col 100, 150 # 目标像元坐标 site_spi { name: data[:, row, col] for name, data in spi_results.items() } # 创建干旱事件识别函数 def identify_droughts(spi_series, threshold-1.5): droughts [] in_drought False for i, val in enumerate(spi_series): if val threshold and not in_drought: start i in_drought True elif val threshold and in_drought: end i droughts.append((start, end, end-start)) in_drought False return droughts空间可视化技巧import matplotlib.colors as colors # 创建干旱等级色带 cmap colors.ListedColormap([ #8B0000, #FF0000, #FFA500, #FFFF00, #ADFF2F, #006400 ]) bounds [-2.5, -2, -1.5, -1, 1, 1.5, 2.5] norm colors.BoundaryNorm(bounds, cmap.N) # 绘制特定月份的SPI空间分布 month_idx -1 # 最近一个月 fig, axes plt.subplots(1, 3, figsize(18, 6)) for ax, (name, data) in zip(axes, spi_results.items()): im ax.imshow(data[month_idx], cmapcmap, normnorm) ax.set_title(f{name} - 最近月份) fig.colorbar(im, axax, labelSPI值) plt.savefig(output/spi_spatial.png, dpi300)5. 实际应用中的问题排查在真实项目中使用gma计算SPI时经常会遇到以下几类问题常见错误及解决方案错误现象可能原因解决方法计算结果全为NaN输入数据包含无效值检查并处理NoData值维度不匹配错误Axis参数设置不当确认数据形状和计算轴结果范围异常降水数据单位错误确认输入为毫米/月性能优化建议对于大区域计算考虑分块处理# 分块处理示例 chunk_size 100 # 行数 for i in range(0, pre_data.shape[1], chunk_size): chunk pre_data[:, i:ichunk_size, :] spi_chunk gma.climet.SPI(chunk, Axis0, Scale3) # 处理并保存分块结果使用Dask等并行计算库处理超大型数据集计算结果及时保存为磁盘文件避免内存溢出在农业保险项目中我们发现SPI-3能较好反映作物生长期的干旱状况而水文管理则更关注SPI-12的长期趋势。根据具体需求选择合适的时间尺度至关重要。

更多文章