你能在nc文件中提取基于多年日期范围的数据吗



我有一个由温度数据组成的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 ...

如何每年提取上述日期范围?

您必须添加变量days作为dataset.set_coords('days')的坐标。然后您可以使用sel检索数据的切片

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

阵列和时间序列的进一步读数

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

对于这个示例,我将使用xarray:中日期时间访问器的dayofyearyearis_leap_year属性

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))
indexer = indexer & ds.days.dt.year.isin(year_range)
result = ds.sel(time=indexer)

闰年的逻辑有点笨拙,但我想不出更干净的方法了。

相关内容

最新更新