如何删除xarray中包含特定日期(1904-01-01)的行?
问题
我有一个从NetCDF4文件读取的xarray数据,其time维度中存在部分含无效数据的行,这些行的时间戳均为'1904-01-01T00:00:00.000000',且无明确NaN值,其他数据列的无效值也非NaN。我需要删除这些整行数据。
原始time维度数据:
<xarray.DataArray 'time' (time: 5760)> array(['2018-02-21T00:00:04.000000000', '2018-02-21T00:00:19.000000000', '1904-01-01T00:00:00.000000000', '2018-02-21T00:00:34.000000000', ..., '2018-02-21T23:59:52.000000000', '1904-01-01T00:00:00.000000000', '1904-01-01T00:00:00.000000000', '2018-02-21T23:59:58.000000000', '1904-01-01T00:00:00.000000000'], dtype='datetime64[ns]')
期望处理后的time维度数据:
<xarray.DataArray 'time' (time: 5760)> array(['2018-02-21T00:00:04.000000000', '2018-02-21T00:00:19.000000000', '2018-02-21T00:00:34.000000000', ..., '2018-02-21T23:59:52.000000000', '2018-02-21T23:59:58.000000000'], dtype='datetime64[ns]')
之前尝试的无效方法:
dropna因无NaN值无法生效;DS = DS[DS.time != '2020-01-01T00:00:00']无效;DS = DS.where(DS.time > '2020-01-01T00:00:00')无效;
解决方案
无效原因说明
你之前的尝试失败,主要是两个问题:
- 对比的时间戳错误——用了
2020-01-01而非目标无效值1904-01-01; where方法只会将不符合条件的值设为NaN,不会直接删除行,维度会保持不变。
正确处理方式
方法一:布尔索引直接过滤
先创建筛选掩码,再用掩码提取有效行:
# 定义无效时间戳 invalid_time = '1904-01-01T00:00:00.000000' # 生成布尔掩码:保留时间不等于无效值的行 mask = DS.time != invalid_time # 过滤数据集 DS_filtered = DS[mask]
方法二:sel结合取反操作
利用sel方法配合取反逻辑,实现相同的过滤效果:
invalid_time = '1904-01-01T00:00:00.000000' DS_filtered = DS.sel(time=~(DS.time == invalid_time))
方法三:时间范围筛选
如果所有有效时间都远晚于1904-01-01,可以直接用时间范围过滤:
DS_filtered = DS.sel(time=DS.time > '1904-01-02T00:00:00')
结果验证
处理完成后,查看DS_filtered.time即可确认无效行已被删除,数据集的time维度长度会对应减少。
内容的提问来源于stack exchange,提问作者Swawa
相关产品推荐
相关产品推荐

