能否根据日期范围提取一个nc文件中多个年份的数据?

2 人关注

我有一个由温度数据组成的nc文件。我想提取2001年到2018年5月30日到8月18日这一日期范围内的温度。时间变量的格式如下: 2001-01-23 。我不介意它是 Python 还是 cdo 。我的数据总体上看起来是这样的。

<xarray.Dataset>
Dimensions:  (crs: 1, lat: 9, lon: 35, time: 6574)
Coordinates:
  * lat      (lat) float64 50.0 52.5 55.0 57.5 60.0 62.5 65.0 67.5 70.0
  * lon      (lon) float64 177.5 180.0 182.5 185.0 ... 255.0 257.5 260.0 262.5
  * crs      (crs) uint16 3
Dimensions without coordinates: time
Data variables:
    days     (time) datetime64[ns] 2001-01-01 2001-01-02 ... 2018-12-31
    tmax     (time, lat, lon) float32 ...

我怎样才能为每一年提取上述的日期范围?

4 个评论
在提问时请遵循SO准则,特别是 "你尝试过什么?"
@RobertWilson, nothing.
如果这是真的,那么请删除你的问题并搜索CDO和xarray用户指南。
如果我已经试图通过这些,但仍然没有发现任何有用的东西,因此,什么也没做?
python
netcdf
python-xarray
cdo-climate
Thomas
Thomas
发布于 2020-10-30
2 个回答
dl.meteo
dl.meteo
发布于 2020-10-31
已采纳
0 人赞同

你必须把你的变量 days 作为一个坐标添加到 dataset.set_coords('days') 中。然后,你可以使用 sel 来检索你的数据切片

dataset.sel(time=slice("2001-01-23", "2018-01-01"))

关于xarray和时间序列的进一步阅读

spencerkclark
spencerkclark
发布于 2020-10-31
0 人赞同

在这种情况下,我发现最好的方法(简单的范围是不够的)是看我能否构造一个与时间坐标相同长度的布尔数组,如果该值是我想包括在选择中的日期,则为 True ,如果不是则为 False 。 然后我可以把这个布尔数组作为索引传递给 sel ,以获得我想要的选择。

在这个例子中,我将利用 dayofyear year is_leap_year 的属性。 日期时间访问器 在xarray中。

import pandas as pd
# Note dayofyear represents days since January first of the year,
# so it is offset by one after February 28/29th in leap years
# versus non-leap years.
may_30_leap = pd.Timestamp("2000-05-30").dayofyear
august_18_leap = pd.Timestamp("2000-08-18").dayofyear
range_leap = range(may_30_leap, august_18_leap + 1)
may_30_noleap = pd.Timestamp("2001-05-30").dayofyear
august_18_noleap = pd.Timestamp("2001-08-18").dayofyear
range_noleap = range(may_30_noleap, august_18_noleap + 1)
year_range = range(2001, 2019)
indexer = ((ds.days.dt.dayofyear.isin(range_leap) & ds.days.dt.is_leap_year) |
           (ds.days.dt.dayofyear.isin(range_noleap) & ~ds.days.dt.is_leap_year))