我有一个从1979年1月1日到2005年12月31日的3D时间序列数据矩阵。矩阵目前是9862x360x720(每日降雨量x 0.5°纬度x 0.5°经度)。我想将每日降雨量与月降雨量(总共324个月)相加,同时还设定了NaN值总和的阈值。
换句话说,如果特定纬度/经度网格单元的每日NaN值超过10个,我想将每月求和单元格标记为NaN。如果网格单元的每日NaN值少于10个,我想将剩余的非NaN每日值相加并将其用作月值。
我使用xarray库的“resample”函数取得了成功,但我无法找到为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文件中。
答案 0 :(得分:0)
我相信这可以做你想要的:
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