You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 08:24:34