【问题标题】:How do I slice a range that occur every nth time?如何对每 n 次出现的范围进行切片?
【发布时间】:2021-02-18 16:34:13
【问题描述】:

我有一个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 分割我需要的时间范围,但我不知道如何并且似乎无法在 SO 上找到足够的答案。 在我的具体情况下,我需要从每年 5 月 30 日(一年中的第 150 天)到 8 月 18 日(一年中的第 229 天)之间进行切片。我知道第一片应该是这样的:

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

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

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

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

【问题讨论】:

  • 亲爱的托马斯,你试过ds.sel(time=[149, 229])吗?您可能必须将time 设置为坐标。 xarray.pydata.org/en/stable/indexing.html
  • 嗨@dl.meteo。感谢你的回复!它还可以手动选择我需要的每个范围,因此在范围之间跳过 285 天。谢谢!

标签: python netcdf python-xarray cdo-climate


【解决方案1】:

我通过 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])

【讨论】:

    【解决方案2】:

    从您的回答看来您知道时间片,因此您也可以使用 cdo 提取它们

    cdo seltimestep,149/229 in.nc out.nc 
    

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

    第1步:将日历类型设置为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 功能来做你想要的操作

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 2019-07-13
      • 1970-01-01
      • 2019-04-28
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多