Timedelta error with numpy.longdouble dtype

I have time with dtype numpy.longdouble, and when I try to use these values ​​with a function timedelta, I have errors. But when I convert it to numpy.float64, everything is fine. Can anyone explain this behavior?

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)

When I try to see dtypes of variables, they look the same, but not the same thing:

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

Edit

And it is strange that it does not work for np.int32 and 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
+4
source share
2 answers

So, timedeltafor dtype is np.longdoublenot implemented?

In short, yes.

From the documentation :

class datetime.timedelta ([days [, seconds [, microseconds [, [, [, [, ]]]]]]])

0. ints, longs floats .

"long" Python long, float longdouble.


Update

, , , np.float64. , -, , numpy 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

OP , timedelta(np.int64(1)) Python 3.4.3. , , , numpy Python 3x, np.int64 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
+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 features.
%quickref -> Quick reference.
help      -> Python 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)
0

Source: https://habr.com/ru/post/1614735/


All Articles