Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Datetime series cannot subtract numpy.datetime64 #12830

Closed
pganssle opened this issue Apr 8, 2016 · 2 comments
Closed

Datetime series cannot subtract numpy.datetime64 #12830

pganssle opened this issue Apr 8, 2016 · 2 comments
Labels
Datetime Datetime data dtype Dtype Conversions Unexpected or buggy dtype conversions Duplicate Report Duplicate issue or pull request

Comments

@pganssle
Copy link
Contributor

pganssle commented Apr 8, 2016

For some reason, it's not possible to subtract a numpy.datetime64 object from a Series, even though subtracting a datetime.datetime object is possible. I found this bug when trying to work around issue #8554.

Code Sample, a copy-pastable example if possible

import pandas as pd
import numpy as np
from datetime import datetime

EPOCH = datetime(1970, 1, 1)
EPOCH64 = np.datetime64(EPOCH)

df = pd.DataFrame(pd.date_range('2014-11-19', '2014-11-21', freq='D'))

epoch_ts = df[0] - EPOCH                                       # Works
epoch_tsnp = pd.Series(df[0].values - EPOCH64, name=0)         # Works
epoch_ts64 = df[0] - EPOCH64                                   # TypeError

Expected Output

epoch_ts and epoch_tsnp are both:

0   16393 days
1   16394 days
2   16395 days
Name: 0, dtype: timedelta64[ns]

There is a TypeError raised when epoch_ts64 is calculated. A full stack trace follows:

~/anaconda3/lib/python3.5/site-packages/pandas/core/ops.py in wrapper(left, right, name, na_op)
    605 
    606         time_converted = _TimeOp.maybe_convert_for_time_op(left, right, name,
--> 607                                                            na_op)
    608 
    609         if time_converted is None:

~/anaconda3/lib/python3.5/site-packages/pandas/core/ops.py in maybe_convert_for_time_op(cls, left, right, name, na_op)
    565             return None
    566 
--> 567         return cls(left, right, name, na_op)
    568 
    569 

~/anaconda3/lib/python3.5/site-packages/pandas/core/ops.py in __init__(self, left, right, name, na_op)
    279 
    280         lvalues = self._convert_to_array(left, name=name)
--> 281         rvalues = self._convert_to_array(right, name=name, other=lvalues)
    282 
    283         self.name = name

~/anaconda3/lib/python3.5/site-packages/pandas/core/ops.py in _convert_to_array(self, values, name, other)
    400             if (supplied_dtype is None and other is not None and
    401                 (other.dtype in ('timedelta64[ns]', 'datetime64[ns]')) and
--> 402                     isnull(values).all()):
    403                 values = np.empty(values.shape, dtype='timedelta64[ns]')
    404                 values[:] = iNaT

~/anaconda3/lib/python3.5/site-packages/pandas/core/common.py in isnull(obj)
    174     pandas.notnull: boolean inverse of pandas.isnull
    175     """
--> 176     return _isnull(obj)
    177 
    178 

~/anaconda3/lib/python3.5/site-packages/pandas/core/common.py in _isnull_new(obj)
    184         raise NotImplementedError("isnull is not defined for MultiIndex")
    185     elif isinstance(obj, (ABCSeries, np.ndarray, pd.Index)):
--> 186         return _isnull_ndarraylike(obj)
    187     elif isinstance(obj, ABCGeneric):
    188         return obj._constructor(obj._data.isnull(func=isnull))

~/anaconda3/lib/python3.5/site-packages/pandas/core/common.py in _isnull_ndarraylike(obj)
    275         result = values.view('i8') == tslib.iNaT
    276     else:
--> 277         result = np.isnan(values)
    278 
    279     # box

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

output of pd.show_versions()

INSTALLED VERSIONS
------------------
commit: None
python: 3.5.1.final.0
python-bits: 64
OS: Linux
OS-release: 3.19.0-58-generic
machine: x86_64
processor: x86_64
byteorder: little
LC_ALL: None
LANG: en_US.UTF-8

pandas: 0.18.0
nose: 1.3.7
pip: 8.1.1
setuptools: 20.2.2
Cython: 0.23.4
numpy: 1.10.4
scipy: 0.17.0
statsmodels: 0.6.1
xarray: None
IPython: 4.0.3
sphinx: 1.3.5
patsy: 0.4.0
dateutil: 2.5.1
pytz: 2016.3
blosc: None
bottleneck: 1.0.0
tables: 3.2.2
numexpr: 2.4.6
matplotlib: 1.5.1
openpyxl: 2.3.2
xlrd: 0.9.4
xlwt: 1.0.0
xlsxwriter: 0.8.4
lxml: 3.5.0
bs4: 4.4.1
html5lib: None
httplib2: None
apiclient: None
sqlalchemy: 1.0.11
pymysql: None
psycopg2: None
jinja2: 2.8
boto: 2.39.0
@jreback jreback added Datetime Datetime data dtype Dtype Conversions Unexpected or buggy dtype conversions Duplicate Report Duplicate issue or pull request labels Apr 8, 2016
@jreback jreback added this to the No action milestone Apr 8, 2016
@jreback
Copy link
Contributor

jreback commented Apr 8, 2016

dupe of #7996

@jreback jreback closed this as completed Apr 8, 2016
@jreback
Copy link
Contributor

jreback commented Apr 8, 2016

pull-request are welcome to fix, its actually quite easy as all it needs is coercion if it not M8[ns]. Right about where the error is now.

In [48]: df[0] - EPOCH64.astype('M8[ns]')
Out[48]: 
0   16393 days
1   16394 days
2   16395 days
Name: 0, dtype: timedelta64[ns]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Datetime Datetime data dtype Dtype Conversions Unexpected or buggy dtype conversions Duplicate Report Duplicate issue or pull request
Projects
None yet
Development

No branches or pull requests

2 participants