2010-08-28 21 views
7

Tengo un numpy.array 2d, donde la primera columna contiene datetime.datetime objetos, y los segundos enteros columna:Cómo filtrar numpy.ndarray por fecha?

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) 

Lo que me gustaría hacer es seleccionar todas las filas para una fecha específica, algo así como

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) 

¿Cómo puedo lograr esto?

Gracias por su comprensión :)

Respuesta

4

Se podría hacer esto:

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] es la primera columna de A.

Desafortunadamente, al comparar A[:,0] con un objeto datetime.date, se genera un TypeError. Sin embargo, la comparación con un objeto datetime.datetime funciona:

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) 

también, por desgracia,

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

plantea una TypeError demasiado, ya que esto requiere __lt__ método en lugar del método de la matriz numpy __lt__datetime.datetime 's. Quizás esto es un error.

De todos modos, no es difícil trabajar; se puede decir

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) 

Dado que esto le da una matriz booleana, se puede usar como un "índice de fantasía" para A, que produce el resultado deseado.

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 para indicarme datetime.replate() –

Cuestiones relacionadas