问题描述
我有一个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功能进行所需的操作