Xarray DataArray用idxmin()+where()返回全NaT数组问题求解
定位xarray中首次非零值的日期(忽略全零位置)
问题分析
你需要从三维xarray.DataArray(维度为time/lat/lon)中,找出每个经纬度位置首次出现非零值的日期,但之前的方法存在两个问题:
da.idxmin(dim='time')会把0当作最小值,错误返回最早的日期(而非首次非零的日期)da.where(da>0).idxmin(dim='time')既会找最小非零值的位置(不是首次出现的位置),还会因全零位置过滤后全为NaN,返回NaT
正确解决方案
核心思路是:先标记非零值的位置,找到第一个非零值的索引,再映射到对应的日期,最后过滤全零位置。
# 1. 创建布尔数组,标记每个时间步是否为非零值 non_zero_mask = da > 0 # 2. 获取每个经纬度位置首次非零值的索引(argmax返回第一个True的位置) first_nonzero_idx = non_zero_mask.argmax(dim='time') # 3. 映射到对应的日期 first_date = da.time[first_nonzero_idx] # 4. 将全零的经纬度位置设为NaN(保留有非零值位置的日期) first_date = first_date.where(non_zero_mask.any(dim='time'))
代码解释
non_zero_mask.argmax(dim='time'):布尔数组中True等价于1,False等价于0,argmax会返回第一个1的索引,也就是首次非零值出现的时间位置non_zero_mask.any(dim='time'):生成二维数组(lat/lon),标记哪些位置至少存在一个非零值,用它过滤后,全零位置会被设为NaN- 该方法高效且准确,能处理30年日度数据的规模
内容的提问来源于stack exchange,提问作者Salit
相关产品推荐
相关产品推荐

