在多个条件下过滤数据数组

时间:2016-11-18 12:53:51

标签: python python-xarray

从xarray的教程数据中,我想提取一个DataArray,其中包含月中温暖天数,定义为22到30摄氏度之间:

airtemps = xr.tutorial.load_dataset('air_temperature')
airtemps = airtemps.sel(time=slice('2013-01-01', '2013-12-31'))
airtemps['air'] = airtemps.air - 273.15

air_day = airtemps.resample('1D', 'time', how='mean')
# Define multiple conditions - How can this be done programatically?

我现在正在寻找一种以编程方式创建此地图的方法,也可以添加更多条件

meets_condition = (air_day.air > 22) & (air_day.air < 30)
warm_days = meets_condition.resample('M', dim='time', how='sum')

条件可以这样定义:

not_cold = ('air',  operator.ge, 22)
not_hot  = ('air',  operator.le, 30)

我可以简单地用一个条件来做到这一点:

variable, operator_fn, value = not_cold
meets_condition = operator_fn(air_day[variable], value)
warm_but_possibly_hot_days = meets_condition.resample('M', dim='time', how='sum')

但我正在动态地添加多个。我可以这样做

comfy_warm = [not_cold, not_hot]

all_maps = [fn(air_day[var], val) for var, fn, val in comfy_warm]
(all_maps[0] & all_maps[1]).resample('M', dim='time', how='sum')

但是我想做某事。像这样

np.all(all_maps).resample('M', dim='time', how='sum')

为方便起见,这是gist。一如既往,我提前感恩

2 个答案:

答案 0 :(得分:1)

我想你想要这个:

[your list variable here].map(e => (e._1, e._7))

它将xr.ufuncs.logical_and.reduce(all_maps) 操作元素应用于所有相同长度的布尔数组,并产生一个相同长度的结果。当然,您可以使用and或任何其他合适的ufunc

答案 1 :(得分:1)

我们无法使用DataArray s来提供np.logical_and.reduce(),但它可以很好地处理纯数组,因此我随后用

提供它
all_maps = [fn(air_day[var], val).values for var, fn, val in comfy_warm]

然后我将此地图添加为新数据变量并重新取样

air_day['nice_days'] = (['time', 'lat', 'lon'], np.logical_and.reduce(all_maps))    
air_day.nice_days.resample('M', dim='time', how='sum')