如何使用xarray按特定12小时时间间隔切片netCDF4数据集
如何使用xarray按特定12小时时间间隔切片netCDF4数据集
我看到你有一个6小时间隔的xarray时间序列数据,现在想要把它转换成12小时间隔,只保留每天00:00和12:00的记录对吧?你之前尝试用xr_ds.sel(Time=slice(_date_times[0], _date_times[-1]), freq='12 h'),但确实sel的slice参数不支持freq,咱们换个更直接的思路来解决:
先再明确下你的场景:
你现有的时间序列是这样的(6小时间隔):
<xarray.DataArray 'Time' (Time: 21)> Size: 168B array(['2025-01-30T00:00:00.000000000', '2025-01-30T06:00:00.000000000', '2025-01-30T12:00:00.000000000', '2025-01-30T18:00:00.000000000', '2025-01-31T00:00:00.000000000', '2025-01-31T06:00:00.000000000', '2025-01-31T12:00:00.000000000', '2025-01-31T18:00:00.000000000', '2025-02-01T00:00:00.000000000', '2025-02-01T06:00:00.000000000', '2025-02-01T12:00:00.000000000', '2025-02-01T18:00:00.000000000', '2025-02-02T00:00:00.000000000', '2025-02-02T06:00:00.000000000', '2025-02-02T12:00:00.000000000', '2025-02-02T18:00:00.000000000', '2025-02-03T00:00:00.000000000', '2025-02-03T06:00:00.000000000', '2025-02-03T12:00:00.000000000', '2025-02-03T18:00:00.000000000', '2025-02-04T00:00:00.000000000'], dtype='datetime64[ns]')
想要得到的是只保留0点和12点的序列:
<xarray.DataArray 'Time' (Time: 21)> Size: 168B array(['2025-01-30T00:00:00.000000000', '2025-01-30T12:00:00.000000000', '2025-01-31T00:00:00.000000000', '2025-01-31T12:00:00.000000000', '2025-02-01T00:00:00.000000000', '2025-02-01T12:00:00.000000000', '2025-02-02T00:00:00.000000000', '2025-02-02T12:00:00.000000000', '2025-02-03T00:00:00.000000000', '2025-02-03T12:00:00.000000000', '2025-02-04T00:00:00.000000000'], dtype='datetime64[ns]')
方法一:通过筛选小时数直接提取目标时间点
xarray的时间变量有dt访问器,可以直接获取时间的小时部分,我们只需要筛选小时为0或者12的记录就行:
# 筛选出Time变量小时为0或12的所有数据 filtered_ds = xr_ds.sel(Time=xr_ds.Time.dt.hour.isin([0, 12]))
这个方法直接从现有时间序列里挑出符合条件的时间点,完全匹配你想要的结果。
方法二:用布尔索引过滤
如果你更习惯布尔索引的写法,也可以这样实现,效果和方法一完全一致:
# 创建布尔掩码,标记小时为0或12的时间点 mask = (xr_ds.Time.dt.hour == 0) | (xr_ds.Time.dt.hour == 12) # 应用掩码筛选数据,drop=True会移除被标记为False的记录 filtered_ds = xr_ds.where(mask, drop=True)
小补充
你之前用到的freq参数,一般是在resample或asfreq这类用于时间重采样、对齐的函数里使用的,而咱们这里是从已有数据里筛选特定时间点,所以用dt访问器的方式会更直接。
你可以打印筛选后的时间变量验证结果:
print(filtered_ds.Time)
备注:内容来源于stack exchange,提问作者sundar_ima
相关产品推荐
相关产品推荐

