Суммируйте дневной временной ряд в месячный временной ряд с пороговым значением NaN

У меня есть матрица данных временных рядов 3D с 1 января 1979 года по 31 декабря 2005 года. В настоящее время она имеет размер 9862x360x720 (дневное количество осадков x 0,5° широты x 0,5° долготы). Я хочу суммировать суточные осадки в месячные осадки (всего 324 месяца), а также установить порог для суммирования значений NaN.

Другими словами, если существует более 10 ежедневных значений NaN для конкретной ячейки сетки широта / долгота, я хочу пометить ежемесячно суммированную ячейку как NaN. Если для ячейки сетки имеется менее 10 ежедневных значений NaN, я хочу суммировать оставшиеся ежедневные значения, отличные от NaN, и использовать их в качестве месячного значения.

Мне удалось использовать функцию "resample" библиотеки xarray, но я не мог найти способ установить порог для значений NaN. Все, что я прочитал, говорит об использовании функций sum или nansum, но я не могу найти способ установить порог NaN с помощью одной из этих функций. Я открыт для любого метода на данный момент (xarray или иначе).

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

f = netCDF4.Dataset("daily_data", 'r')

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

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

Я смог суммировать ежедневные данные с ежемесячными с помощью вышеуказанного кода, но я не смог установить порог NaN. Ежедневные данные в настоящее время хранятся в файле NetCDF.

1 ответ

Решение

Я считаю, что это делает то, что вы хотите:

NaN = float("nan") # Make a constant for NaN

def sum_nan_threshold(iterable, *, nan_threshold=10):
    if sum(x == NaN for x in iterable) >= nan_threshold: # Are there more NaNs then threshold?
        return NaN
    else:
        return sum(x for x in iterable if x != NaN) # Else sum up if not equal to NaN
Другие вопросы по тегам