2010-08-28 11 views
7

मैं एक 2d numpy.array, जहां पहले कॉलम datetime.datetime वस्तुएं शामिल है, और दूसरे स्तंभ पूर्णांकों:तिथि के आधार पर numpy.ndarray को फ़िल्टर कैसे करें?

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) 

मैं इसे कैसे प्राप्त कर सकता हूं?

अपने अंतर्दृष्टि के लिए धन्यवाद :)

उत्तर

4

आप ऐसा कर सकता है:

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 ऑब्जेक्ट के साथ एक टाइपरर उठाती है। हालांकि, एक 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) 

एक लेखन त्रुटि भी, इस कॉल के बाद से 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 है, जो वांछित परिणाम पैदावार के रूप में उपयोग कर सकते हैं।

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 मुझे datetime.replate() पर इंगित करने के लिए +1 –

संबंधित मुद्दे