如何用Python的Xarray数据集统计连续3天及以上高温事件数
统计Xarray数据集中连续3天及以上高温事件的数量
问题背景
我有一个包含time、rlat、rlon三个维度的Xarray数据集,其中tasmax变量取值为0或1(1代表气温超过30℃,0代表低于30℃)。需要统计每个像素至少连续3天取值为1的事件数量,最终生成一个压缩时间维度的6×4栅格数据集,每个像素对应符合条件的高温事件数。
数据读取代码:
import xarray as xr tm = 'C:/Path_to_NC/EC7_heatjulZA26_30.nc' dmax = xr.open_dataset(tm, decode_coords="all") da_max = dmax['tasmax']
之前通过np.sum(da_max, axis=0)得到的是所有高温天数,而非连续事件数,需要替换为针对性的统计方法。
解决方案:滑动窗口+事件起始标记法
这种方法高效适配Xarray的向量化操作,步骤如下:
- 滑动窗口识别连续3天高温:用长度为3的滑动窗口计算时间序列的和,等于3则说明这三天均为高温;
- 标记事件起始点:通过对比当前时间步与前一时间步的滑动窗口结果,标记新事件的起始(避免重复计数);
- 统计事件数量:对每个像素的起始点求和,得到符合条件的事件数。
完整代码:
import numpy as np # 1. 滑动窗口计算连续3天的高温总和 rolling_sum = da_max.rolling(time=3, center=False).sum() # 标记连续3天及以上的时段(sum=3代表三天都是1) continuous_heat = (rolling_sum == 3).astype(int) # 2. 标记每个连续事件的起始点:当连续高温标记从0变为1时,即为新事件开始 event_starts = continuous_heat - continuous_heat.shift(time=1, fill_value=0) # 3. 统计每个像素的事件数量,压缩时间维度 heat_event_count = event_starts.sum(dim='time') # 转换为带空间坐标的Xarray数据集(可选,保留原栅格坐标) heat_event_dataset = heat_event_count.to_dataset(name='heat')
结果说明
运行后heat_event_count是一个6×4的Xarray DataArray,每个值对应该像素的连续3天及以上高温事件数量。例如,若某像素有2次连续4天的高温,结果会显示为2,而非8(总高温天数)。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

