Извлечь элементы из массива: между заданными значениями / условиями - PullRequest
0 голосов
/ 30 ноября 2011

У меня есть несколько данных временных рядов в массивах, и я хочу извлечь значения между данными датами как можно проще, избегая циклов. Вот пример:

from numpy import *
from datetime import *

# datetime array
date_a=array([
datetime(2000,1,1),
datetime(2000,1,2),
datetime(2000,1,3),
datetime(2000,1,4),
datetime(2000,1,5),
])

# item array, indices corresponding to datetime array
item_a=array([1,2,3,4,5])

# extract items in a certain date range
# after a certain date, works fine
item_b=item_a[date_a >= (datetime(2000,1,3))] #Out: array([3, 4, 5])

# between dates ?
item_c=item_a[date_a >= (datetime(2000,1,3)) and date_a <= (datetime(2000,1,4))]
# returns: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Есть ли однострочное решение для этого? Я смотрел на numpy any() и all(), а также на where(), не имея возможности найти решение. Я ценю любую помощь и указания!

Ответы [ 3 ]

4 голосов
/ 30 ноября 2011

Если вам нужен однострочник, вы можете использовать

item_c=item_a[(date_a >= (datetime(2000,1,3))) * (date_a <= (datetime(2000,1,4)))]
3 голосов
/ 30 ноября 2011

Мне не понятно, почему вы используете переменную item_a.Но чтобы выделить нужные записи, вы можете просто сделать:

>>> np.where(np.logical_and(date_a >= datetime(2000,1,3), date_a <= datetime(2000,1,4)))
(array([2, 3]),)

Полученные индексы начинаются с нуля, поэтому они соответствуют третьему и четвертому элементу вашего массива.* РЕДАКТИРОВАТЬ: np из-за import numpy as np.Выполнение from numpy import * на самом деле очень плохая идея .Вы перезапишете встроенные функции, такие как sum и abs, например ...

HTH!

1 голос
/ 30 ноября 2011

Я думаю, что следующее должно работать для вас, используя Понимание списка

[item_a[i] for i in xrange(0,len(date_a)) if date_a[i] >= (datetime(2000,1,3)) and date_a[i] <= (datetime(2000,1,4))]

Выбрать все элементы в item_a в range 0 <= i < length of date_a where datetime(2000,1,3) <= date_a[i] <= datetime(2000,1,4)

...