2010-08-28 10 views
7

Ho un numpy.array 2d, in cui la prima colonna contiene datetime.datetime oggetti, e la seconda colonna interi:Come filtrare un numpy.ndarray per data?

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) 

Quello che vorrei fare è selezionare tutte le righe per una data specifica, qualcosa di simile

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) 

Come posso ottenere questo risultato?

Grazie per la vostra comprensione :)

risposta

4

Si potrebbe fare questo:

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] è la prima colonna di A.

Sfortunatamente, il confronto di A[:,0] con un oggetto datetime.date genera un errore TypeError. Tuttavia, il confronto con un oggetto datetime.datetime funziona:

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) 

Inoltre, purtroppo,

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

solleva una TypeError troppo, dal momento che questo chiama __lt__ metodo al posto del metodo della matrice NumPy __lt__datetime.datetime s'. Forse questo è un bug.

In ogni caso, non è difficile lavorare; si può dire

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) 

Dal momento che questo ti dà una matrice booleana, è possibile utilizzarlo come un "indice di fantasia" per A, che produce il risultato desiderato.

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 per il riferimento a datetime.replate() –

Problemi correlati