numpy.longdouble dtype的timedelta错误

时间:2015-11-06 12:35:19

标签: python numpy types timedelta python-datetime

我有时间使用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

3 个答案:

答案 0 :(得分:3)

  

所以dtype timedelta的{​​{1}}可能没有实现吗?

简而言之,是的。

来自the documentation

  

class np.longdouble([ [, [,微秒 [,毫秒 [,分钟 [,小时 [,]]]]]]])

     

所有参数都是可选的,默认为datetime.timedelta参数可能是整数,长整数或浮点数,可能是正数或负数。

此处" long" 指的是Python 0整数,而不是long浮点数。

更新

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

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

timedelta

然而,OP在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 使用Python 3.4.3 工作的评论中报告了。我认为这是因为when numpy is built on Python 3x, np.int64 no longer subclasses int

这是Python 3.4.3中发生的事情:

timedelta(np.int64(1))

答案 1 :(得分:1)

在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)

答案 2 :(得分:0)

我遇到了类似的问题

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

timedelta(days = int(value)) 有效。

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