Как отфильтровать numpy.ndarray по дате?

У меня есть 2d numpy.array, где первый Столбец содержит объекты datetime.datetime и целые числа второго столбца:

A = array([[2002-03-14 19:57:38, 197],
       [2002-03-17 16:31:33, 237],
       [2002-03-17 16:47:18, 238],
       [2002-03-17 18:29:31, 239],
       [2002-03-17 20:10:11, 240],
       [2002-03-18 16:18:08, 252],
       [2002-03-23 23:44:38, 327],
       [2002-03-24 09:52:26, 334],
       [2002-03-25 16:04:21, 352],
       [2002-03-25 18:53:48, 353]], dtype=object)

Что я хотел бы сделать, это выбрать все строки для конкретной даты, что-то вроде

A[first_column.date()==datetime.date(2002,3,17)]
array([[2002-03-17 16:31:33, 237],
           [2002-03-17 16:47:18, 238],
           [2002-03-17 18:29:31, 239],
           [2002-03-17 20:10:11, 240]], dtype=object)

Как мне этого добиться?

Спасибо за ваше понимание: )

7
задан andreas-h 28 August 2010 в 21:45
поделиться

1 ответ

Вы можете сделать так:

from_date=datetime.datetime(2002,3,17,0,0,0)
to_date=from_date+datetime.timedelta(days=1)
idx=(A[:,0]>from_date) & (A[:,0]<=to_date)
print(A[idx])
# array([[2002-03-17 16:31:33, 237],
#        [2002-03-17 16:47:18, 238],
#        [2002-03-17 18:29:31, 239],
#        [2002-03-17 20:10:11, 240]], dtype=object)

A[:,0] — первый столбец A.

К сожалению, сравнение A[:,0] с объектом datetime.date вызывает ошибку TypeError. Однако сравнение с объектом datetime.datetime работает:

In [63]: A[:,0]>datetime.datetime(2002,3,17,0,0,0)
Out[63]: array([False,  True,  True,  True,  True,  True,  True,  True,  True,  True], dtype=bool)

Кроме того, к сожалению,

datetime.datetime(2002,3,17,0,0,0)<A[:,0]<=datetime.datetime(2002,3,18,0,0,0)

также вызывает TypeError, так как это вызывает datetime.datetime __lt__ Метод вместо метода массива numpy __lt__. Возможно, это ошибка.

Во всяком случае, это нетрудно обойти; вы можете сказать

In [69]: (A[:,0]>datetime.datetime(2002,3,17,0,0,0)) & (A[:,0]<=datetime.datetime(2002,3,18,0,0,0))
Out[69]: array([False,  True,  True,  True,  True, False, False, False, False, False], dtype=bool)

Поскольку это дает вам булев массив, вы можете использовать его как "причудливый индекс" для A, что дает желаемый результат.

5
ответ дан 7 December 2019 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: