您可以在 nc 文件中根据多年的日期范围提取数据吗?
Can you extract data based on date range for multiple years in a nc file?
我有一个包含温度数据的 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 ...
每年如何提取上述日期范围?
我通常会发现在这些情况下(一个简单的范围是不够的)最好的方法是看看我是否可以构造一个与时间坐标长度相同的布尔数组,即 True
如果value 是我想包含在选择中的日期,如果不是,则为 False
。然后我可以将这个布尔数组作为 sel
中的索引器传递以获得我想要的选择。
对于此示例,我将使用 xarray:
中 datetime accessor 的 dayofyear
、year
和 is_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)
闰年逻辑有点笨拙,但我想不出更简洁的方法。
您必须添加变量 days
作为 dataset.set_coords('days')
的坐标。然后,您可以使用 sel
检索数据切片
dataset.sel(time=slice("2001-01-23", "2018-01-01"))
我有一个包含温度数据的 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 ...
每年如何提取上述日期范围?
我通常会发现在这些情况下(一个简单的范围是不够的)最好的方法是看看我是否可以构造一个与时间坐标长度相同的布尔数组,即 True
如果value 是我想包含在选择中的日期,如果不是,则为 False
。然后我可以将这个布尔数组作为 sel
中的索引器传递以获得我想要的选择。
对于此示例,我将使用 xarray:
中 datetime accessor 的dayofyear
、year
和 is_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)
闰年逻辑有点笨拙,但我想不出更简洁的方法。
您必须添加变量 days
作为 dataset.set_coords('days')
的坐标。然后,您可以使用 sel
检索数据切片
dataset.sel(time=slice("2001-01-23", "2018-01-01"))