您可以根据nc文件中多年的日期范围提取数据吗?

时间:2020-10-30 09:08:27

标签: python netcdf python-xarray cdo-climate

我有一个由温度数据组成的nc文件。我想提取2001年至2018年5月30日至8月18日日期范围内的温度。时间变量的格式为let tempArry = Data.filter( (item) => item.shipmentNumber.includes(props.dataToTable) ) 。我不在乎它是在2001-01-23还是Python中。我的数据总体如下:

cdo

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

2 个答案:

答案 0 :(得分:1)

通常,在这些情况下(一个简单的范围就不足),我发现最好的方法是查看是否可以构造一个长度与时间坐标为True的布尔数组,如果值是我想在选择中包括的日期,如果没有,则为False。然后,我可以将此布尔数组作为sel中的索引器进行传递,以获得我想要的选择。

在此示例中,我将使用xarray中datetime accessordayofyearyearis_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)

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

答案 1 :(得分:1)

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

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

Further Readings on xarray and Time Series