如何处理NaT/1970日期让python-xarray的ds.time.dt.season正常工作
报错原因
你对整个Dataset调用.where()时,Dataset内同时存在datetime64类型的time坐标,以及float64类型的数值变量,全局指定的other参数无法同时适配两种不兼容的数据类型,因此触发类型错误。
之前你传入np.nan时替换不生效,是因为datetime64类型无法接收浮点类型的nan,无效日期没有被成功覆盖。
解决方案
方法1:默认无other参数的where调用(推荐)
xarray的.where()方法不指定other参数时,会自动根据每个字段的类型填充对应空值:浮点类字段填充np.nan,时间类字段自动填充np.datetime64("NaT"),不会有类型冲突:
mask = (ds.time.dt.year >= 2008) & (ds.time.dt.year <= currentYear) # 自动适配各字段类型填充空值 ds = ds.where(mask) # 如果需要删除全空的条目,可以加drop=True # ds = ds.where(mask, drop=True)
方法2:单独修改time坐标后过滤
如果需要明确控制时间字段的替换逻辑,可以单独操作time坐标,避免影响其他数值字段:
# 仅替换time坐标中的无效日期为NaT ds['time'] = ds.time.where( (ds.time.dt.year >= 2008) & (ds.time.dt.year <= currentYear), other=np.datetime64("NaT") ) # 过滤掉time为NaT对应的所有条目 ds = ds.where(ds.time.notnull(), drop=True)
内容的提问来源于stack exchange,提问作者PierreL
相关产品推荐
相关产品推荐

