如何分割每n次出现的范围?

问题描述

我有一个nc文件,其中的时间变量有点奇怪。它不是公历,而是每年365天的简单日历(即不包括leap年)。这意味着单位也有一点关闭,但没有什么令人担心的。

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-2001,而737386代表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天日历。我认为您需要将日历设置为这种类型,然后可能会重置时间单位和reftime。没有示例文件,我无法进行测试,但是我认为类似的方法可以工作:

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

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

然后您需要查看文件中的第一个日期,可以将其传送到以下日期:

cdo showdate out2.nc | less 

步骤2:然后,您可以使用cdo,shifttime将时间轴偏移到正确的日期

例如如果表演日期将第一天定为2302-04-03,那么您只需完成

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

更正日期...

然后,您应该能够使用文件上的所有cdo功能进行所需的操作