Можете ли вы извлечь данные на основе диапазона дат за несколько лет в файл NC?

У меня есть файл NC, состоящий из данных о температуре. Я хочу извлечь температуру для диапазона дат с 30 мая по 18 августа с 2001 по 2018 годы. Переменная времени имеет следующий формат 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 ...

Как я могу извлечь для каждого года указанный выше диапазон дат?


person Thomas    schedule 30.10.2020    source источник
comment
Пожалуйста, следуйте рекомендациям SO, задавая вопросы, особенно Что вы пробовали?   -  person Robert Wilson    schedule 30.10.2020
comment
@ Роберт Уилсон, ничего.   -  person Thomas    schedule 30.10.2020
comment
Если это правда, удалите свой вопрос и выполните поиск в руководствах пользователя CDO и xarray.   -  person Robert Wilson    schedule 30.10.2020
comment
И если я попытался пройти через них и все еще не нашел ничего полезного, значит, ничего не сделал?   -  person Thomas    schedule 30.10.2020


Ответы (2)


Обычно я считаю, что лучший подход в этих случаях (когда простого диапазона будет недостаточно) - это посмотреть, могу ли я построить логический массив той же длины, что и координата времени, равная True, если значение - это дата, которую я хотел бы включить в выбор и False, если это не так. Затем я могу передать этот логический массив в качестве индексатора в sel, чтобы получить желаемый выбор.

В этом примере я бы использовал атрибуты dayofyear, year и is_leap_year средство доступа datetime в 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))
indexer = indexer & ds.days.dt.year.isin(year_range)

result = ds.sel(time=indexer)

Логика високосного года немного неуклюжа, но я не могу придумать более чистого способа.

person spencerkclark    schedule 31.10.2020
comment
Проблему с високосным годом можно обойти, используя pd.date_range() вместе с пониманием списка, которое проходит через year_range. date_range = [pd.date_range(start= f'{year}-05-30',end = f'{year}-08-18',freq='d') for year in year_range] Затем сгладьте список date_range = [item for sublist in date_range for item in sublist]. Наконец, ds.sel(time=date_range) - person MorningGlory; 21.07.2021

Вы должны добавить свои переменные days в качестве координаты с dataset.set_coords('days'). Затем вы можете использовать sel для извлечения фрагментов ваших данных.

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

Дополнительная литература по xarray и временным рядам

person dl.meteo    schedule 31.10.2020