2010-08-28 9 views
7

Mam 2d numpy.array, gdzie pierwsza kolumna zawiera datetime.datetime przedmiotów, a druga kolumna liczb całkowitych:Jak filtrować numpy.ndray według daty?

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) 

Co chciałbym zrobić, to wybrać wszystkie wiersze na dany termin, coś jak

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) 

Jak mogę to osiągnąć?

Dzięki za wglądu :)

Odpowiedz

4

mógłby to zrobić:

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] jest pierwsza kolumna A.

Niestety, porównanie obiektu A[:,0] z obiektem datetime.date wywołuje błąd TypeError. Jednak porównanie z datetime.datetime obiektu działa:

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) 

także, niestety,

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

podnosi TypeError zbyt, ponieważ wymaga to datetime.datetime „s __lt__ metoda zamiast __lt__ metoda NumPy Array. Być może to błąd.

W każdym razie nie jest trudno obejść się; można powiedzieć

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) 

Ponieważ daje tablicę logiczną, można użyć go jako „wyszukane” indeksu do A, co daje pożądanego rezultatu.

2
from datetime import datetime as dt, timedelta as td 
import numpy as np 

# Create 2-d numpy array 
d1 = dt.now() 
d2 = dt.now() 
d3 = dt.now() - td(1) 
d4 = dt.now() - td(1) 
d5 = d1 + td(1) 
arr = np.array([[d1, 1], [d2, 2], [d3, 3], [d4, 4], [d5, 5]]) 

# Here we will extract all the data for today, so get date range in datetime 
dtx = d1.replace(hour=0, minute=0, second=0, microsecond=0) 
dty = dtx + td(hours=24) 

# Condition 
cond = np.logical_and(arr[:, 0] >= dtx, arr[:, 0] < dty) 

# Full array 
print arr 
# Extracted array for the range 
print arr[cond, :] 
+0

+1 za skierowanie mnie do datetime.replate() –