NumPy中recarray的datetime64

3

我无法创建一个日期时间数据类型的记录数组。我使用的是Python 2.7和Numpy 1.7版本。

以下是一个最简示例:

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')]

有什么提示吗?
2个回答

4

指定一个“日期” 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]')])

请注意,您也可以将数据直接输入为字符串(例如'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]')])

看起来,在单一dtype和结构dtype的情况下,这些类型的解释方式是不同的。如果您使用单一dtype,就不会遇到像这样的问题:

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有一个关于日期时间的页面,它内容比较繁重但回答了大多数问题。

需要注意两点:

  • 与Python的datetime一样,日期和时间之间有分隔符。
  • 使用上下文是特定于numpy的([*]后缀)。

上述遇到的问题属于第二种情况,

dtnow = datetime.datetime.now()
numpy.datetime64(dtnow, '[D]')

追溯(Traceback)最近的一次调用: 在第1行,发生了类型错误(TypeError),无法将元数据 [us] 中的 datetime.datetime 对象转换为 [D],根据规则“same_kind”。
numpy.datetime64(dtnow, '[s]')

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

如果您的日期时间不会有任何时间组成部分,那么datetime64[D]就足够了。但是,如果它会有时间组成部分,我建议使用datetime64[s]作为第二级上下文。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接