Skip to content

Commit

Permalink
fix raise of TypeError when subtracting timedelta array
Browse files Browse the repository at this point in the history
  • Loading branch information
illegalnumbers committed Jul 25, 2018
1 parent 716efd3 commit 97c68bd
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 4 deletions.
2 changes: 1 addition & 1 deletion doc/source/whatsnew/v0.24.0.txt
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,7 @@ Datetimelike
Timedelta
^^^^^^^^^

-
- Fixed bug where array of timestamp and deltas raised a TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'Timedelta' (:issue:`21980`)
-
-

Expand Down
10 changes: 7 additions & 3 deletions pandas/_libs/tslibs/timedeltas.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -542,10 +542,14 @@ def _binary_op_method_timedeltalike(op, name):

elif hasattr(other, 'dtype'):
# nd-array like
if other.dtype.kind not in ['m', 'M']:
if other.dtype.kind not in ['m', 'M', 'O']:
# raise rathering than letting numpy return wrong answer
return NotImplemented
return op(self.to_timedelta64(), other)
try:
converted_other = other.astype('datetime64[ns]')
return op(self.to_timedelta64(), converted_other)
except:
return NotImplemented

elif not _validate_ops_compat(other):
return NotImplemented
Expand Down Expand Up @@ -929,7 +933,7 @@ cdef class _Timedelta(timedelta):
def nanoseconds(self):
"""
Return the number of nanoseconds (n), where 0 <= n < 1 microsecond.
Returns
-------
int
Expand Down
19 changes: 19 additions & 0 deletions pandas/tests/series/test_timeseries.py
Original file line number Diff line number Diff line change
Expand Up @@ -1012,3 +1012,22 @@ def test_get_level_values_box(self):
index = MultiIndex(levels=levels, labels=labels)

assert isinstance(index.get_level_values(0)[0], Timestamp)

def test_diff_sub_timedelta(self):
# GH 21980
arr = np.array([Timestamp('20130101 9:01'),
Timestamp('20121230 9:02')])
exp = np.array([Timestamp('20121231 9:01'),
Timestamp('20121229 9:02')]).astype('datetime64[ns]')
res = arr - pd.Timedelta('1D')
tm.assert_numpy_array_equal(res, exp)

def test_diff_sub_timedelta_mixed(self):
# GH 21980
now = pd.Timestamp.now()
arr = np.array([now,
Timestamp('20121230 9:02')])
exp = np.array([now - pd.Timedelta('1D'),
Timestamp('20121229 9:02')]).astype('datetime64[ns]')
res = arr - pd.Timedelta('1D')
tm.assert_numpy_array_equal(res, exp)

0 comments on commit 97c68bd

Please sign in to comment.