如何对第 n 次出现的范围进行切片?

How do I slice a range that occur every nth time?

我有一个 nc 文件,其中的时间变量有点奇怪。它不是公历,而是一个简单的一年 365 天的日历(即不包括闰年)。这意味着该装置也有点偏差,但没什么太令人担忧的。

xarray.DataArray 'days' (time: 6570)>
array([730817., 730818., 730819., ..., 737384., 737385., 737386.])
Dimensions without coordinates: time
Attributes:
    units:      days_since_Jan11900
    long_name:  calendar_days

730817代表01-01-2001737386代表31-12-2018

我想获取某个时间段的多年数据集,就像你可以用cdo -seldmonth, -selday等做的那样。但是当然,没有日期,我不能使用其他很棒的选项。我的想法是用 np.slice 分割我需要的时间范围,但我不知道如何并且似乎无法找到足够的答案。 在我的具体情况下,我需要从每年的 5 月 30 日(一年中的第 150 天)到 8 月 18 日(一年中的第 229 天)划分一个范围。我知道第一片应该是这样的:

ds = ds.loc[dict(time = slice(149,229))]

但是,这只会给我 2001 年的范围,而不是接下来的年份。

我不能用 cdo -ntime 做,因为它不识别时间单位。

如何确保我也能获得接下来 17 年的范围?通过在我需要的范围之间跳过 285 天?

我通过 Python 修复了它。它可能可以以更智能的方式完成,但我在@dl.meteo 的帮助下并使用 np.r_.

手动选择了我需要的范围
ds = ds.sel(time=np.r_[149:229,514:594,879:959,1244:1324,1609:1689,1974:2054,2339:2419,2704:2784,3069:3149,3434:3514,3799:3879,4164:4244,4529:4609,4894:4974,5259:5339,5624:5704,5989:6069,6354:6434])

根据您的回答,您似乎知道时间片,因此您也可以使用

使用 cdo 提取它们
cdo seltimestep,149/229 in.nc out.nc 

等等

但如果您想使用 cdo 进行(半)自动操作,也应该可以,因为 cdo 支持 365 天日历。我认为您需要将日历设置为这种类型,然后可能会重置时间单位和参考时间。没有示例文件,我无法对此进行测试,但我认为这样的方法可行:

第一步:将日历类型设置为365,然后将参考数据设置为您的第一个日期:

cdo setcalendar,365_day infile.nc out1.nc
cdo setreftime,2000-01-01,00:00:00 out1.nc out2.nc 

然后您需要查看文件中的第一个日期,您可以将其通过管道传递给 less:

cdo showdate out2.nc | less 

第 2 步:然后您可以使用 cdo,shifttime

将时间轴移动到正确的日期

例如如果 showdate 给出的第一天是 2302-04-03,那么你可以简单地做

cdo shiftime,-302years -shifttime,-3months -shifttime,-2days out2.nc out3.nc 

更正日期...

那么您应该能够使用文件上的所有 cdo 功能来按照您的意愿进行操作