Count三维数据数组(lat, lon, time)中连续值在时间上的最长序列



这是我第一次在这里提问,如果你需要更多的信息来建议解决方案,请告诉我。

我有一个三维布尔数据数组(time, lat, lon),我使用python 3中的xarray库对其进行了处理。我正在使用的数据数组包括一年的数据,它具有每日时间步长(365-366天,具体取决于是否为闰年)。

示例数据数组的维度显示在这里,示例netcdf文件可以在这里下载并加载为da = xr.open_dataset('data.nc')。此示例仅包含五个时间步骤。

我想知道每个单元格(或像素)的True值的最长序列是多长。包含最长序列的输出应该是一个二维数据数组或数据帧。因此,例如,如果一个单元格的值为[True, True, True, False, True],那么我想为该像素获得的结果是3,因为这代表了三个连续的True值。

我已经尝试使用da.cumsum('time')使用时间累积和,但这会增加所有值,即使它们不是连续的,但这不是我想要的。

对于二维数据框架,以前也有人问过类似的问题,例如这里和这里。但是我还没有能够在三维数据框架中成功地实现这些解决方案。

由于我对Python和xarray相当陌生,我不知道如何实现这一点。如有任何意见,不胜感激。

如果有人需要解决方案,我在这里找到了一个。在这里,@tda建议每次在原始数据数组中遇到零时,使用这行代码将累积和重置为零:cumulative = data.cumsum(dim='time')-data.cumsum(dim='time').where(data.values == 0).ffill(dim='time').fillna(0)其中data为原始数据数组,我们将在此基础上进行累加和计算。

非常感谢!我不得不在resample之后使用这个,所以我将你的代码嵌入到一个函数中:

def n_longest_consecutive(ds, dim='time'):
ds = ds.cumsum(dim=dim) - ds.cumsum(dim=dim).where(data == 0).ffill(dim=dim).fillna(0)
return data.max(dim=dim)

我刚刚删除了where内的.values:它强制data的评估,工作流程不再是"懒惰"。

最新更新