Можно ли выбрать набор данных по временному диапазону, когда диапазон отличается для каждого пикселя в модуле pythons xarray

#python #indexing #multi-index #python-xarray

Вопрос:

Я пытаюсь выбрать только эту часть данных в определенном временном диапазоне, который отличается для каждого пикселя.

Для индексирования у меня есть два np.datetime64[ns] xr.Массива данных с формой(лат.: 152, лон:131) с именем time_range_min, time_range_max, в одном из которых указаны даты начала, а в другом-даты окончания.

Я пытаюсь сделать это для выбора данных

 dataset = data.sel(time=slice(time_range_min, time_range_max))
 

но это дает

невозможно использовать нескалярные массивы в срезе для индексирования xarray: Массив данных ‘NDVI’ (лат.: 152, лон: 131)>

Если я не могу использовать нескалярные массивы, это означает, что это вообще невозможно сделать, или я могу преобразовать свои массивы?

Ответ №1:

Если «время» — это список дат в строке, упорядоченный от прошлого к настоящему (например [«10-20-2021», «10-21-2021», …]:

 import numpy as np
listOfMinMaxTimeRanges = [time_range_min, time_range_max]
specifiedRangeOfTimeIndexedList = []
for indexingListOfMinMaxTimeRanges in range(np.shape(listOfMinMaxTimeRanges)[1])):
  specifiedRangeOfTimeIndexed = [specifiedRangeOfTime for specifiedRangeOfTime in np.arange(0, len(time), 1) if time.index(listOfMinMaxTimeRanges[0][indexingListOfMinMaxTimeRanges]) <= specifiedRangeOfTime <= time.index(listOfMinMaxTimeRanges[1][indexingListOfMinMaxTimeRanges])]
  for indexes in range(len(specifiedRangeOfTimeIndexed)):
    specifiedRangeOfTimeIndexedList.append(specifiedRangeOfTimeIndexed[indexes])
 

В зависимости от того, как структурирован ваш набор данных:

 dataset = data.sel(time = specifiedRangeOfTimeIndexedList)
 

или

 dataset = data.sel(time = time[specifiedRangeOfTimeIndexedList])
 

или

 dataset = dataset[time[specifiedRangeOfTimeIndexedList]]
 

или

 dataset = dataset[:, time[specifiedRangeOfTimeIndexedList]]
 

или

 dataset = dataset[time[specifiedRangeOfTimeIndexedList], :, :]
 

или

 dataset = dataset[specifiedRangeOfTimeIndexedList]
 

Ответ №2:

Я нашел способ сгруппировать каждую ячейку с помощью стекирования в xarray: time_range_min и time_range_max теперь помечают одну дату

 stack = dataset.value.stack(gridcell=['lat', 'lon'])
for unique_value, grouped_array in stack.groupby('gridcell'):
    grouped_array.sel(time=slice(time_range_min,time_range_max))