Skip to content

Commit 324208e

Browse files
committed
Merge pull request #7503 from jreback/dt
BUG: Bug in timeops with non-aligned Series (GH7500)
2 parents 9d064f3 + c404c43 commit 324208e

File tree

3 files changed

+30
-4
lines changed

3 files changed

+30
-4
lines changed

doc/source/v0.14.1.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,10 @@ Bug Fixes
165165
~~~~~~~~~
166166

167167

168+
- Bug in timeops with non-aligned Series (:issue:`7500`)
168169

169170

170-
171-
- Bug in ``value_counts`` where ``NaT`` did not qualify as missing (``NaN``) (:issue:`7423`)
171+
- Bug in ``value_counts`` where ``NaT`` did not qualify as missing (``NaN``) (:issue:`7423`)
172172

173173

174174

pandas/core/ops.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,12 @@ class _TimeOp(object):
245245
def __init__(self, left, right, name):
246246
self.name = name
247247

248+
# need to make sure that we are aligning the data
249+
if isinstance(left, pd.Series) and isinstance(right, pd.Series):
250+
left, right = left.align(right)
251+
252+
self.left = left
253+
self.right = right
248254
lvalues = self._convert_to_array(left, name=name)
249255
rvalues = self._convert_to_array(right, name=name, other=lvalues)
250256

@@ -426,6 +432,7 @@ def maybe_convert_for_time_op(cls, left, right, name):
426432
is_datetime_lhs = com.is_datetime64_dtype(left)
427433
if not (is_datetime_lhs or is_timedelta_lhs):
428434
return None
435+
429436
# rops are allowed. No need for special checks, just strip off
430437
# r part.
431438
if name.startswith('__r'):
@@ -463,6 +470,7 @@ def wrapper(left, right, name=name):
463470

464471
if isinstance(right, pd.DataFrame):
465472
return NotImplemented
473+
466474
time_converted = _TimeOp.maybe_convert_for_time_op(left, right, name)
467475

468476
if time_converted is None:
@@ -472,8 +480,8 @@ def wrapper(left, right, name=name):
472480
elif time_converted == NotImplemented:
473481
return NotImplemented
474482
else:
475-
lvalues = time_converted.lvalues
476-
rvalues = time_converted.rvalues
483+
left, right = time_converted.left, time_converted.right
484+
lvalues, rvalues = time_converted.lvalues, time_converted.rvalues
477485
dtype = time_converted.dtype
478486
wrap_results = time_converted.wrap_results
479487

pandas/tests/test_series.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2838,6 +2838,24 @@ def run_ops(ops, get_ser, test_ser):
28382838
td1 + dt1
28392839
dt1 + td1
28402840

2841+
def test_ops_datetimelike_align(self):
2842+
if _np_version_under1p7:
2843+
raise nose.SkipTest("timedelta broken in np < 1.7")
2844+
2845+
# GH 7500
2846+
# datetimelike ops need to align
2847+
dt = Series(date_range('2012-1-1', periods=3, freq='D'))
2848+
dt.iloc[2] = np.nan
2849+
dt2 = dt[::-1]
2850+
2851+
expected = Series([timedelta(0),timedelta(0),pd.NaT])
2852+
2853+
result = dt2-dt
2854+
assert_series_equal(result,expected)
2855+
2856+
result = (dt2.to_frame()-dt.to_frame())[0]
2857+
assert_series_equal(result,expected)
2858+
28412859
def test_timedelta64_functions(self):
28422860

28432861
from datetime import timedelta

0 commit comments

Comments
 (0)