2012-08-22 70 views
2

我有一個numpy數組中的數據(從.csv文件中讀取)。 np.genfromtxt的相關摘錄如下:訪問numpy.where中的對象方法?

dtype = [("Category", "|S10"), 
     ("Status", "|S11"), 
     ("Date_start", object), 
     ("Date_stop", object)], 
names=True, 
converters={2:lambda d:datetime.strptime(d, "%d/%m/%y"), 
      3:lambda d:datetime.strptime(d, "%d/%m/%y")} 
) 

所有工作都有一個例外 - 訪問datetime對象的元素。代碼返回下面的兩行正是我期望:

print inp['Date_start'][1].month #returns 7 
print np.where(inp['Category'] == '"R5"') #returns an array of matching indices 

,但下面的代碼行拋出AttributeError: 'numpy.ndarray' object has no attribute 'month'

print np.where(inp['Date_start'].month == 7) 

這意味着在此基礎上月份的事情發生在我不能返回結果,我需要。

有沒有辦法從np.where獲得我想要的行爲?

回答

3

你可以定義一個矢量屬性的getter:

def func(a): 
    return a.month 

vfunc = np.vectorize(func) 

,然後使用:

np.where(vfunc(inp['Date_start']) == 7) 
+0

工作就像一個魅力,謝謝。 –

1

正如你已經注意到了,你的inp['Date_Start']是一個標準的ndarraydtype='object'正因爲如此,它不沒有其元素的屬性。

除了矢量屬性吸氣劑是@ user545424建議,你可以這樣做:

test = np.fromiter((i.month == 7 for i in inp['Date_start']), 
        count=inp.size, dtype=bool) 

(在count=inp.size幫助np.fromiter更有效地運行檢查功能的文檔)。

從那裏,您可以使用test篩選您想要的元素,或者使用np.zeros(test)來獲取滿足條件的項目的索引。

但是,如果您有很多日期處理,您可能需要考慮使用pandas,它接管了scikits.timseries的大部分功能。我寫這篇文章時,對numpy日期的支持仍然被認爲是實驗性的。