【问题标题】:numpy datetime64 in recarrayrecarray 中的 numpy datetime64
【发布时间】:2013-05-17 21:55:35
【问题描述】:

我在使用 datetime64 类型创建记录数组时遇到问题。我正在运行 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')]

提示,有人吗?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    指定一个“日期”日期时间数据类型。即"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'
    

    【讨论】:

      【解决方案2】:

      numpy 在日期时间有一个page,它很重,但可以回答大多数问题。

      需要注意的两点:

      • 日期和时间的分离就像python的日期时间一样
      • 特定于 numpy 的使用上下文([*] 后缀)

      上面遇到的问题属于第二种,

      dtnow = datetime.datetime.now()
      numpy.datetime64(dtnow, '[D]')
      
      回溯(最近一次通话最后): 文件“”,第 1 行,在 TypeError:无法根据规则“same_kind”将 datetime.datetime 对象从元数据 [us] 转换为 [D]
      numpy.datetime64(dtnow, '[s]')
      

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

      如果您的日期时间永远不会有任何时间组件,那么 datetime64[D] 就足够了。

      但是,如果有的话,我建议使用 datetime64[s] 作为二级上下文。

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多