2015-11-06 4 views
4

У меня есть времена с dtype numpy.longdouble и когда я пытаюсь использовать эти значения с помощью функции timedelta У меня есть ошибки. Но когда я конвертирую его в numpy.float64, все в порядке. Может ли кто-нибудь объяснить это поведение?ошибка timedelta с numpy.longdouble dtype

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

Вы можете иметь некоторые экспликации [здесь] (http://stackoverflow.com/questions/132988/is-there- a-difference-between-and-is-in-python) – MaTh

ответ

2

Так может быть timedelta для dtype np.longdouble не реализован?

Короче говоря, да.

От the documentation:

классdatetime.timedelta ([дней [, секунд [, микросекунд [, миллисекунды [, минут [, часов [, недель]]]]]]])

Все аргументы являются необязательными и по умолчанию являются 0. Аргументы могут быть ints, longs или floats, и могут быть положительными или отрицательными.

Здесь "длинный" относится к Python long целого, а не longdouble поплавка.


Update

Я думаю, что я понял, казалось бы, противоречивое поведение np.float64. Что, по-видимому, имеет значение, является ли subty dtype подклассом одного из собственных скалярных типов Python, который принимает timedelta.

На моей 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 

Однако ОП сообщили в комментариях, что 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 
+0

Это действительно странно. Я думал, что python независим от платформы. Какую версию numpy и python вы используете? Mine: 'numpy: 1.10.1; Python 3.4.3' –

+0

Да, это похоже на поведение, характерное для Python3. См. Мое обновление. –

0

На 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) 
Смежные вопросы