根据月份列表选择xarray / pandas索引

时间:2018-01-11 19:17:55

标签: python pandas numpy python-xarray

我从Select xarray/pandas index based on specific months成功实施了回答。

def is_amj(month):
    return (month >= 4) & (month <= 6)

seasonal_data = temp_data.sel(time=is_amj(temp_data['time.month']))

不幸的是,我需要在几个月的选择中更灵活(例如1月和12月,或2月到11月,或1月,3月,5月......)。我想用几个月的清单。

我尝试按如下方式修改代码

sel_months = [1,3,5] #in the case of january,march and may

def to_keep(month):
    return (month in sel_months)

seasonal_data = temp_data.sel(time=to_keep(temp_data['time.month']))

但我收到以下消息

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

并没有找到实现a.any()建议的正确方法。

欢迎任何帮助。

3 个答案:

答案 0 :(得分:1)

我最近一直在考虑这个问题,我同意这种方法有点限制性(有时候你不想要3个月......)。因此,每次需要不同的东西时,为函数添加更多参数并不是一个好的解决方案。

但是,正如你可以看到here还有其他方法可以做到这一点,这很简单:

months = [1,2,3,4] # for example season = data.sel(time = np.in1d( data['time.month'], months))

那就行了。

答案 1 :(得分:0)

COLDSPEED评论和whagi答案都有效,但https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.in1d.html建议使用np.isin,然后我使用了np.isin(month, sel_months)

答案 2 :(得分:0)

我修改了shoyer的答案(来自我的问题)并创建了这个小功能。 t_months就像你有几个月一样的列表。 t2m可能与temp_data的结构相同。虽然可能有更优雅的解决方案,但它对我来说效果很好。

def extract_months(month, start, end):
    return (month >= start) & (month <= end)


t2m_months = t2m_slice.sel(time=extract_months(t2m_slice['time.month'],t_months[0],t_months[-1]))