【问题标题】:timedelta error with numpy.longdouble dtypenumpy.longdouble dtype 的 timedelta 错误
【发布时间】:2016-02-07 14:36:37
【问题描述】:

我有时间使用 dtype numpy.longdouble,当我尝试将这些值与 timedelta 函数一起使用时,我遇到了错误。但是当我将其转换为numpy.float64 时,一切都很好。有人可以解释这种行为吗?

import numpy as np
from datetime import timedelta
t1 = np.array([1000], dtype=np.longdouble)
t2 = np.array([1000], dtype=np.float64)

In [166]: timedelta(seconds=t1[0])
TypeError: unsupported type for timedelta seconds component: numpy.float64

In [167]: timedelta(seconds=t2[0])
Out[167]: datetime.timedelta(0, 1000)

In [168]: timedelta(seconds=t1[0].astype(np.float64))
Out[168]: datetime.timedelta(0, 1000)

当我尝试查看变量的 dtypes 时,它们看起来相似但不一样:

In [172]: t1[0].dtype
Out[172]: dtype('float64')

In [173]: t2[0].dtype
Out[173]: dtype('float64')

In [174]: np.longdouble == np.float64
Out[174]: False

In [175]: t1[0].dtype == t2[0].dtype
Out[175]: True

编辑

奇怪的是它也不适用于 np.int32 和 np.int64:

t3 = np.array([1000], dtype=np.int32)
t4 = np.array([1000], dtype=np.int64)

In [29]: timedelta(t3[0])
TypeError: unsupported type for timedelta days component: numpy.int32

In [69]: timedelta(t4[0])
TypeError: unsupported type for timedelta days component: numpy.int64

【问题讨论】:

  • 你可能有一些解释here

标签: python numpy types timedelta python-datetime


【解决方案1】:

我遇到了类似的问题

timedelta(days = value.astype(int)) 没用,但是

timedelta(days = int(value)) 工作。

我希望它对未来的 Google 员工有用。

【讨论】:

    【解决方案2】:

    在 Anaconda64、Win7、Python 2.7.11、NumPy 1.10.1 上,timedelta 对 numpy.int32 的响应取决于值:

    In [3]: datetime.timedelta(seconds = numpy.int32(2147))
    Out[3]: datetime.timedelta(0, 2147)
    
    In [4]: datetime.timedelta(seconds = numpy.int32(2148))
    Out[4]: datetime.timedelta(-1, 84253, 32704)
    

    来自 Spyder 启动的完整日志:

    Python 2.7.11 |Anaconda 2.1.0 (64-bit)| (default, Dec  7 2015, 14:10:42) [MSC v.1500 64 bit (AMD64)]
    Type "copyright", "credits" or "license" for more information.
    
    IPython 4.0.0 -- An enhanced Interactive Python.
    ?         -> Introduction and overview of IPython's features.
    %quickref -> Quick reference.
    help      -> Python's own help system.
    object?   -> Details about 'object', use 'object??' for extra details.
    %guiref   -> A brief reference about the graphical user interface.
    In [1]: import numpy
    
    In [2]: import datetime
    
    In [3]: datetime.timedelta(seconds = numpy.int32(2147))
    
    Out[3]: datetime.timedelta(0, 2147)
    
    In [4]: datetime.timedelta(seconds = numpy.int32(2148))
    
    Out[4]: datetime.timedelta(-1, 84253, 32704)
    

    【讨论】:

      【解决方案3】:

      所以也许timedelta dtype np.longdouble 没有实现?

      简而言之,是的。

      来自the documentation

      datetime.timedelta([[, [, 微秒[, 毫秒[, 分钟[, 小时[, ]]]]]]])

      所有参数都是可选的,默认为0参数可以是整数、长整数或浮点数,可以是正数或负数。

      这里 “long” 指的是 Python long 整数,而不是 longdouble 浮点数。


      更新

      我想我已经发现了 np.float64 看似不一致的行为。 似乎相关的是 numpy dtype 是否继承了 timedelta 接受的原生 Python 标量类型之一。

      在我的 64 位机器上,运行 Python 2.7.9,numpy v1.10.1:

      In [1]: timedelta(np.float64(1))
      Out[1]: datetime.timedelta(1)
      
      In [2]: timedelta(np.float32(1))
      ---------------------------------------------------------------------------
      TypeError                                 Traceback (most recent call last)
      <ipython-input-2-4a7874ba393b> in <module>()
      ----> 1 timedelta(np.float32(1))
      
      TypeError: unsupported type for timedelta days component: numpy.float32
      
      In [3]: timedelta(np.int64(1))
      Out[3]: datetime.timedelta(1)
      
      In [4]: timedelta(np.int32(1))
      ---------------------------------------------------------------------------
      TypeError                                 Traceback (most recent call last)
      <ipython-input-4-0475c6c8f1aa> in <module>()
      ----> 1 timedelta(np.int32(1))
      
      TypeError: unsupported type for timedelta days component: numpy.int32
      
      In [5]: issubclass(np.float64, float)
      Out[5]: True
      
      In [6]: issubclass(np.float32, float)
      Out[6]: False
      
      In [7]: issubclass(np.int64, int)
      Out[7]: True
      
      In [8]: issubclass(np.int32, int)
      Out[8]: False
      

      但是 OP 在 cmets 中报告 timedelta(np.int64(1)) 确实使用 Python 3.4.3 工作。我认为这是因为when numpy is built on Python 3x, np.int64 no longer subclasses int.

      以下是 Python 3.4.3 中发生的情况:

      In [1]: timedelta(np.int64(1))
      ---------------------------------------------------------------------------
      TypeError                                 Traceback (most recent call last)
      <ipython-input-1-9902ea26a52d> in <module>()
      ----> 1 timedelta(np.int64(1))
      
      TypeError: unsupported type for timedelta days component: numpy.int64
      
      In [2]: issubclass(np.int64, int)
      Out[2]: False
      

      【讨论】:

      • 这真的很奇怪。我认为python是独立于平台的。您使用的是哪个版本的 numpy 和 python?我的:numpy: 1.10.1; Python 3.4.3
      • 是的,这似乎是 Python3 特有的行为。查看我的更新。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 2018-11-30
      • 2017-02-05
      • 2017-03-02
      相关资源
      最近更新 更多