Как сделать сумму в NetCDF4 с помощью xarray

Я хотел бы сделать ежемесячные суммы моего файла NetCDF4 из ежедневных значений осадков. Однако я совершенно не уверен, что я делаю неправильно. Кажется, что-то изменилось по сравнению с кодом в этом сообщении: with-a-nan-value-threshold">Суммирование дневных временных рядов в месячные временные ряды с пороговым значением NaN

Я не нашел ничего полезного в документации библиотеки.

Вот мой код:

import netCDF4
from netCDF4 import Dataset
import numpy as np
import xarray as xr
import pandas as pd

data = xr.open_dataset('C3S_concat_cropped.nc')
# or I can use 
data2 = Dataset("C3S_concat_cropped.nc", "r", format="NETCDF4")
print(data)
Out:
<xarray.Dataset>
Dimensions:             (lat: 115, lon: 140, time: 15157)
Coordinates:
  * lat                 (lat) float64 -7.4 -7.5 -7.6 -7.7 ... -18.6 -18.7 -18.8
  * lon                 (lon) float64 21.1 21.2 21.3 21.4 ... 34.8 34.9 35.0
  * time                (time) datetime64[ns] 1979-01-01 ... 2020-06-30
Data variables:
    Precipitation_Flux  (time, lat, lon) float32 ...

daily_dataset = xr.Dataset({'Precipitation_Flux': (['time', 'lat', 'lon'],
data['Precipitation_Flux'][:, :, :])}, coords={'lat': (data['lat'][:]), 
'lon': (data['lon'][:]), 'time': pd.date_range('1979-01-01', periods=15157)})

monthly_dataset = daily_dataset['Precipitation_Flux'].resample(indexer='M', time="1D", 
skipna=False).sum()

Моя ошибка значения:

ValueError: the first argument to .resample must be a dictionary

person Lukáš Tůma    schedule 30.11.2020    source источник


Ответы (2)


Вы должны использовать .groupby вместо .resample.

Это должно работать:

monthly_dataset =daily_dataset['Precipitation_Flux'].groupby('time.month').sum('time')

Сначала вы группируете данные по месяцам, а затем вы должны взять сумму по оси времени.

person dl.meteo    schedule 30.11.2020
comment
Это фактически создаст набор данных с 12 записями (месяцами) и очень большими объемами осадков (около 17 000 мм в сезон дождей). Однако хоть что-то работает :-) Теперь подумайте, как сделать это на каждый год отдельно. Кстати... Почему для этого больше не работает ресемплинг? :-) - person Lukáš Tůma; 01.12.2020

Я обнаружил, что эта команда работает для меня!

monthly_dataset = daily_dataset['Precipitation_Flux'].resample(time ='M', 
skipna=False).sum()

Однако документация xarray.Dataset.resample может быть довольно запутанной, так как первый аргумент функции - индексатор обычно не пишется! Так что знайте это! :-)

person Lukáš Tůma    schedule 01.12.2020