基于 30 年月尺度长时间序列的降水和气温模拟数据集的 SPI、SPEI 与 PET 实现

目录

一、核心依赖库与功能分工

二、基础参数构建与维度适配

(一)时间与空间范围定义

(二)季节信号构建与维度修复(核心技术点)

三、网格化气象数据模拟

(一)降水数据模拟(单位:mm)

(二)气温数据模拟(单位:℃)

四、数据封装与单点数据提取

[(一)xarray Dataset 封装](#(一)xarray Dataset 封装)

(二)单点数据筛选(聚焦关键格点)

五、核心气候指数计算(专业算法落地)

(一)潜在蒸散量(PET)计算

(二)标准化降水指数(SPI-3)计算

(三)标准化降水蒸散指数(SPEI-6)计算

六、可视化呈现与结果解读

七、应用场景与扩展方向

八、运行结果


若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!

本代码聚焦气候研究中的关键量化分析需求,通过 Python 科学计算栈与专业气候指数库,实现网格化气象数据模拟、核心气候指数计算(PET、SPI、SPEI)及可视化对比 ,为干旱监测、水资源评估提供高效的技术实现方案。整体技术流程遵循 "数据构建→数据处理→指数计算→可视化" 的逻辑链,依赖多库协同完成专业化分析。

一、核心依赖库与功能分工

依赖库 核心作用
numpy 数组运算核心,负责数据生成、维度调整、随机扰动添加等底层计算
pandas 时间序列处理,快速构建标准化的月度时间轴,为气象数据提供时间坐标支撑
xarray 多维气象数据封装与索引,支持按经纬度、时间快速筛选格点数据,适配气候数据的多维特性
matplotlib.pyplot 结果可视化,绘制指数时间序列对比图,直观呈现干旱等级变化
climate_indices 专业气候指数计算库,内置 Thornthwaite 蒸散量、SPI、SPEI 等成熟算法,简化专业计算流程

本程序所使用到的Python库

二、基础参数构建与维度适配

(一)时间与空间范围定义

首先明确分析的时间跨度与空间覆盖范围,为后续数据模拟奠定基础:

python 复制代码
# 构建30年月度时间序列(1991-2020),共360个时间节点
times = pd.date_range("1991-01-01", "2020-12-31", freq="MS")
# 设定2×2网格化经纬度(聚焦特定区域,减少计算量)
lats = np.array([30.0, 31.0])
lons = np.array([110.0, 111.0])

(二)季节信号构建与维度修复(核心技术点)

气象数据具有显著季节性(如夏季降水多、气温高),需构建季节周期信号,同时解决维度对齐问题:

python 复制代码
# 提取月份信息并转换为numpy数组,生成正弦周期信号(模拟季节变化)
month_values = times.month.values
seasonal_cycle = np.sin(2 * np.pi * month_values / 12)
# 维度扩展:将(360,)转为(360, 1, 1),确保与后续(360, 2, 2)格点数据可广播运算
seasonal_cycle_3d = seasonal_cycle[:, None, None]

关键逻辑:季节信号通过正弦函数生成,周期为 12 个月,取值范围 [-1,1],维度扩展是为了满足 "时间 × 纬度 × 经度" 三维数据的运算兼容性,避免维度不匹配报错。

三、网格化气象数据模拟

为规避真实气象数据的获取依赖,通过 "基础值 + 季节调制 + 随机扰动" 的方式生成符合气候规律的模拟数据:

(一)降水数据模拟(单位:mm)

python 复制代码
np.random.seed(42)  # 固定随机种子,保证结果可复现
# 基础降水(50mm)+ 季节调制(放大季节差异)+ 随机误差(模拟气象不确定性)
precip_base = 50 + 40 * seasonal_cycle_3d
precip_data = np.maximum(0, precip_base + np.random.normal(0, 15, (len(times), len(lats), len(lons))))

核心约束 :使用np.maximum(0, ...)确保降水数据非负 ------ 符合实际气象场景中 "降水不可能为负" 的物理意义,避免数据失真。

(二)气温数据模拟(单位:℃)

python 复制代码
# 基础气温(15℃)+ 季节调制(10倍季节信号,强化冬夏温差)+ 随机扰动
temp_data = 15 + 10 * seasonal_cycle_3d + np.random.normal(0, 2, (len(times), len(lats), len(lons)))

数据特征:气温波动幅度(标准差 2)小于降水(标准差 15),更贴合实际气象数据的变异规律。

四、数据封装与单点数据提取

(一)xarray Dataset 封装

将分散的降水、气温数据与坐标信息整合为结构化数据集,方便后续按维度筛选:

python 复制代码
ds = xr.Dataset(
    {
        "precip": (["time", "lat", "lon"], precip_data),
        "temp": (["time", "lat", "lon"], temp_data),
    },
    coords={"time": times, "lat": lats, "lon": lons},
)

优势 :封装后可通过ds.precip.sel(lat=30.0, lon=110.0)快速提取指定格点数据,无需手动处理数组索引,大幅提升效率。

(二)单点数据筛选(聚焦关键格点)

选择 30.0°N、110.0°E 格点的时间序列数据,用于后续指数计算(单点分析更易聚焦气候变化趋势):

python 复制代码
selected_lat = ds.lat.values[0]
# 提取该格点的气温、降水月度时间序列(长度360)
temp_series = ds.temp.sel(lat=selected_lat, lon=110.0).values
precip_series = ds.precip.sel(lat=30.0, lon=110.0).values

五、核心气候指数计算(专业算法落地)

(一)潜在蒸散量(PET)计算

PET 反映大气蒸发能力,是水资源平衡分析的关键参数,采用 Thornthwaite 经典方法:

python 复制代码
pet = indices.pet(
    temperature_celsius=temp_series,
    latitude_degrees=selected_lat,
    data_start_year=1991
)

参数说明:需输入气温序列、纬度(影响太阳辐射,进而影响蒸散)、数据起始年份,输出月度 PET 序列(单位:mm),前 5 个月结果可初步验证计算合理性。

(二)标准化降水指数(SPI-3)计算

SPI 仅基于降水数据,通过标准化处理量化干旱程度,3 个月尺度(SPI-3)反映短期干旱:

python 复制代码
spi_3 = indices.spi(
    values=precip_series,
    scale=3,  # 时间尺度:3个月累计降水
    distribution=indices.Distribution.gamma,  # 降水数据常用分布假设
    data_start_year=1991,
    calibration_year_initial=1991,
    calibration_year_final=2020,
    periodicity=compute.Periodicity.monthly
)

核心逻辑:先通过 1991-2020 年数据校准伽马分布参数,再将降水数据标准化为正态分布(均值 0、标准差 1),指数为负表示干旱,绝对值越大干旱越严重。

(三)标准化降水蒸散指数(SPEI-6)计算

SPEI 结合降水与蒸散(水分收支平衡),比 SPI 更能反映实际干旱影响,6 个月尺度(SPEI-6)反映中期干旱:

python 复制代码
spei_6 = indices.spei(
    precips_mm=precip_series,
    pet_mm=pet,
    scale=6,
    distribution=indices.Distribution.gamma,
    periodicity=compute.Periodicity.monthly,
    data_start_year=1991,
    calibration_year_initial=1991,
    calibration_year_final=2020,
)

关键差异:相比 SPI,SPEI 引入 PET 计算水分盈亏(降水 - 蒸散),更贴合作物生长、生态需水等实际场景的干旱评估需求。

六、可视化呈现与结果解读

通过图表直观对比 SPI-3 与 SPEI-6 的变化趋势,标注干旱等级阈值:

python 复制代码
plt.figure(figsize=(12, 6))
plot_times = ds.time.values
# 绘制两条指数曲线,区分颜色与标签
plt.plot(plot_times, spi_3, label='SPI-3 (Precipitation)', alpha=0.7, color='blue')
plt.plot(plot_times, spei_6, label='SPEI-6 (Water Balance)', alpha=0.7, color='red')
# 添加基准线与干旱阈值(直观判断干旱等级)
plt.axhline(0, color='black', linestyle='-', linewidth=1, label='Normal')
plt.axhline(-1, color='orange', linestyle='--', label='Moderate Drought')
plt.axhline(-1.5, color='red', linestyle='--', label='Severe Drought')
# 图表美化与布局调整
plt.title("Climate Indices Comparison (Synthetic Data)", fontsize=14)
plt.xlabel("Year", fontsize=12)
plt.ylabel("Index Value", fontsize=12)
plt.legend(loc='best', fontsize=10)
plt.grid(True, alpha=0.3)
plt.tight_layout()

可视化价值:可快速识别以下信息:

  • 曲线低于橙色虚线(y=-1)为中度干旱,低于红色虚线(y=-1.5)为严重干旱;
  • 对比两条曲线,若 SPEI-6 比 SPI-3 更负,说明该时段蒸散量大,水分消耗加剧了干旱。

七、应用场景与扩展方向

核心应用场景:

  • 气象干旱监测:通过 SPI/SPEI 指数快速判断不同时段的干旱等级,为抗旱决策提供数据支撑;
  • 水资源评估:结合 PET 与降水数据,分析区域水分收支平衡,为农业灌溉、水资源调度提供参考;
  • 气候趋势分析:长期时间序列的指数变化可反映区域气候干湿变化趋势。

扩展方向:

  • 数据替换:将模拟数据替换为真实网格化气象观测数据(如 CMIP6 模式数据、站点插值数据),提升分析的实际应用价值;
  • 指数扩展:计算不同尺度(如 1 个月、12 个月)的 SPI/SPEI,分析短期、长期干旱变化;
  • 空间可视化:利用 xarray 与 matplotlib 的结合,绘制 SPI/SPEI 的空间分布图,呈现干旱的空间差异。

八、运行结果

程序输出的计算结果
计算结果可视化图像

若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!

相关推荐
@HNUSTer1 个月前
基于长时间序列的模拟数据集(1990-2022年)利用 Python实现长时序逐月标准化降水指数 SPI(SPI-1)计算与绘图
python 数据分析·气象干旱·长时间序列·模拟数据集·spi(标准化降水指数)·gamma 分布拟合·正态分位数转换