xarray: рассчитать временные ряды ежедневных аномалий из * локальных * среднемесячных значений - PullRequest
1 голос
/ 22 апреля 2020

В настоящее время я работаю с ежедневными климатическими данными (ERA5) и анализирую их с помощью xarray.

da

<xarray.DataArray (time: 8036)>
dask.array<stack, shape=(8036,), dtype=float32, chunksize=(1,), chunktype=numpy.ndarray>
Coordinates:
  * time     (time) datetime64[ns] 1979-01-01 1979-01-02 ... 2000-12-31

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

Я надеваю Не думаю, что сейчас есть простой способ сделать это с помощью xarray, но я был бы признателен за любые обходные пути, которые могут найти люди! :)

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Немного более изящный метод, который может дать вам представление о том, как распространить вещи на другие виды аномалий:

da = da.assign_coords(year_month=da.time.dt.strftime("%Y-%m"))
result = da.groupby("year_month") - da.groupby("year_month").mean("time")
0 голосов
/ 22 апреля 2020

Ладно, думаю, я нашел ответ, если кому-то интересно Я могу биться вместе!

da_cp = da.copy().load()

for year in ['1979', '1980', '1981', ..., '1998', '1999', '2000']:
    for month in ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']:
        da_cp.loc[f'{year}-{month}'] -= da_cp.loc[f'{year}-{month}'].mean('time')

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

...