2013-05-17 56 views
2

我無法用datetime64類型創建記錄數組。我正在運行Python 2.7,Numpy 1.7。numpy datetime64 in recarray

這裏有一個小例子:

p_dtype = np.dtype({"names": ['trns_id', 'trns_date', 'qty', 'price', 'amount', 'description', 'commission', 'fees'], 
        "formats": [long, "M8", float, float, float, "S40", float, float]}) 

p_row = (8609132959, np.datetime64('2012-05-01'), 337.574, 4.86, -1640.61, 'Bought 337.574 XYZ @ 4.86', 0.0, 0.0) 

print p_list, p_dtype 

p_array = np.array(p_row, dtype=p_dtype) 

我得到以下錯誤(&輸出):

TypeError         Traceback (most recent call last) 
<ipython-input-137-0b4de45b819c> in <module>() 
     6 print p_list, p_dtype 
     7 
----> 8 p_array = np.array(p_row, dtype=p_dtype) 
     9 
    10 print "Array: %s, dtype: %s" % (p_array, p_array.dtype) 

TypeError: Cannot cast NumPy timedelta64 scalar from metadata [D] to according to the rule 'same_kind' 

(8609132959.0, numpy.datetime64('2012-05-01'), 337.574, 4.86, -1640.61, 'Bought 337.574 PIMSX @ 4.86', 0.0, 0.0) [('trns_id', '<i8'), ('trns_date', '<M8'), ('qty', '<f8'), ('price', '<f8'), ('amount', '<f8'), ('description', 'S40'), ('commission', '<f8'), ('fees', '<f8')] 

提示,任何人嗎?

回答

3

指定一個「date」datetime dtype。也就是說,"M8[D]"而不是"M8"'datetime64[D]'而不是'datetime64'

In [80]: np.array([(0,np.datetime64('2012-05-17'))], 
    ....:   dtype=[('i',np.int),('date','datetime64[D]')]) 
Out[80]: 
array([(0, datetime.date(2012, 5, 17))], 
     dtype=[('i', '<i8'), ('date', '<M8[D]')]) 

注意,你也可以在你的數據Feed簡單的字符串(即'2012-05-17',而不是np.datetime('2012-05-17')對象)

In [81]: np.array([(0,'2012-05-17')], 
    ....:   dtype=[('i',np.int),('date','datetime64[D]')]) 
Out[81]: 
array([(0, datetime.date(2012, 5, 17))], 
     dtype=[('i', '<i8'), ('date', '<M8[D]')]) 

看來,這些類型不同的解釋在單D型情況下,從結構化的dtype情況。你不會碰到你是一個單一的D型細胞具有象這裏的問題:

In [84]: np.array([np.datetime64('2012-05-17')], dtype='datetime64') # no need for [D] 
Out[84]: array(['2012-05-17'], dtype='datetime64[D]') 

In [85]: np.array(['2012-05-17'], dtype='datetime64') # no need for [D] 
Out[85]: array(['2012-05-17'], dtype='datetime64[D]') 

但要結構化,你有問題:

In [87]: np.array([(0,'2012-05-17')], 
    ....:   dtype=[('i',np.int),('date','datetime64')]) 
--------------------------------------------------------------------------- 
ValueError: Cannot create a NumPy datetime other than NaT with generic units 

In [88]: np.array([(0,np.datetime64('2012-05-17'))], 
    ....:   dtype=[('i',np.int),('date','datetime64')]) 
--------------------------------------------------------------------------- 
TypeError: Cannot cast NumPy timedelta64 scalar from metadata [D] to according to the rule 'same_kind' 
1

numpy的有日期時間一page,它是相當沉重,但回答大多數問題。

有兩點需要注意:

  • 就像在Python的日期時間
  • 的環境下使用,專用於numpy的(在[*]後綴)
日期和時間之間的間隔

以上遇到的問題屬於第二種,

dtnow = datetime.datetime.now() 
numpy.datetime64(dtnow, '[D]') 
 
Traceback (most recent call last): 
    File "", line 1, in 
TypeError: Cannot cast datetime.datetime object from metadata [us] to [D] according to the rule 'same_kind' 
numpy.datetime64(dtnow, '[s]') 

numpy.datetime64( '2015-06-27T14:53:21 + 0300')

如果您的日期時間就永遠不會有比datetime64 [d]的任時間分量就足夠了。但是,如果它有,我會建議使用datetime64 [s]二級上下文。