我有时间使用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
答案 0 :(得分:3)
所以dtype
timedelta
的{{1}}可能没有实现吗?
简而言之,是的。
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 员工有用。