Во-первых, заметка. Создание нового массива данных, копирующего одни и те же идентичные пространственные данные каждый день в течение 3 месяцев, может занять много места на диске без особого смысла. Я бы предпочел запрашивать сезонный массив данных каждый раз, когда вам нужны данные за определенный день.
Однако, если вам действительно нужно выполнить эту операцию и ответить на ваш вопрос, я думаю, что самый простой способ сделать это:
- сначала создайте новый контейнер; np.ndarray - хорошая и аккуратная идея.
- Затем создайте индекс даты,
- запрос вашего оригинального сезона DataArray,
- и, наконец, создайте новый массив данных с измерением времени.
В следующем примере я создал сезонный массив данных для тестирования. Если я точно понял вашу проблему, вы сможете использовать свой оригинальный массив без особых изменений во второй части (с созданием foo).
Давай углубимся в это. Первый импорт:
import xarray as xr
import numpy as np
import pandas as pd
Создать пустой контейнер необходимого размера.
data_s = np.zeros((4, 10, 10))
Заполните его фиктивными значениями.
data_s[0] = 0.5
data_s[1] = 0.9
data_s[2] = 0.8
data_s[3] = 0.45
Создание фиктивных координат.
x = y = np.arange(10)
Создать индекс сезона.
seasons = ["spring", "summer", "autumn", "winter"]
Наконец, создайте массив данных.
bar = xr.DataArray(data_s, coords=[seasons, x, y], dims=['season', 'x', 'y'])
bar - это массив данных, из которого вы хотите извлечь сезонные значения.
Теперь повторите то же самое для отдельных дат.
Создайте массив контейнеров на 2000 дней, который мы будем заполнять данными каждого сезона.
data = np.ones((2000, 10, 10))
x = y = np.arange(10)
dates = pd.date_range('2000-01-01', periods=2000)
Здесь я предполагаю, что бореальные сезоны начинаются с первого числа месяца (заимствовано из здесь .
Конечно, вы можете легко написать лучшую функцию, например, используя день года, чтобы получить сезон.
season = np.array((dates.month %12 + 3)//3)
Создать словарь для преобразования приведенного числа в строку сезона, ранее назначенную в строке
seas_to_num = {1:"spring", 2:"summer", 3:"autumn", 4:"winter"}
Мы заполняем массив для каждого дня значениями, найденными в строке [сезон].
for date, seas in enumerate(season):
data[date] = bar.sel(season=seas_to_num[seas])
Наконец, мы создаем массив данных.
foo = xr.DataArray(data, coords=[dates, x, y], dims=['time', 'x', 'y'])
Теперь, выбрав 5 апреля, мы получаем значение для весны.
In [1]: foo.sel(time=pd.to_datetime("5/4/2001"))
Out[1]:
array([[0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9],
[0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9],
[0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9],
[0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9],
[0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9],
[0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9],
[0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9],
[0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9],
[0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9],
[0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9]])
Coordinates:
time datetime64[ns] 2001-05-03
* x (x) int32 0 1 2 3 4 5 6 7 8 9
* y (y) int32 0 1 2 3 4 5 6 7 8 9