Skip to content

Commit cb93c24

Browse files
changhiskhanwesm
authored andcommitted
BUG: Series op with datetime64 values misbehaves in numpy 1.6
1 parent 923d311 commit cb93c24

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

pandas/core/series.py

+18-6
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242

4343
_np_version = np.version.short_version
4444
_np_version_under1p6 = LooseVersion(_np_version) < '1.6'
45+
_np_version_under1p7 = LooseVersion(_np_version) < '1.7'
4546

4647
_SHOW_WARNINGS = True
4748

@@ -71,19 +72,30 @@ def na_op(x, y):
7172

7273
def wrapper(self, other):
7374
from pandas.core.frame import DataFrame
75+
wrap_results = lambda x: x
76+
77+
lvalues, rvalues = self, other
78+
79+
if (com.is_datetime64_dtype(self) and
80+
com.is_datetime64_dtype(other)):
81+
lvalues = lvalues.view('i8')
82+
rvalues = rvalues.view('i8')
83+
84+
wrap_results = lambda rs: rs.astype('timedelta64[ns]')
85+
86+
if isinstance(rvalues, Series):
87+
lvalues = lvalues.values
88+
rvalues = rvalues.values
89+
7490

75-
if isinstance(other, Series):
7691
if self.index.equals(other.index):
7792
name = _maybe_match_name(self, other)
78-
return Series(na_op(self.values, other.values),
93+
return Series(wrap_results(na_op(lvalues, rvalues)),
7994
index=self.index, name=name)
8095

8196
join_idx, lidx, ridx = self.index.join(other.index, how='outer',
8297
return_indexers=True)
8398

84-
lvalues = self.values
85-
rvalues = other.values
86-
8799
if lidx is not None:
88100
lvalues = com.take_1d(lvalues, lidx)
89101

@@ -98,7 +110,7 @@ def wrapper(self, other):
98110
return NotImplemented
99111
else:
100112
# scalars
101-
return Series(na_op(self.values, other),
113+
return Series(na_op(lvalues.values, rvalues),
102114
index=self.index, name=self.name)
103115
return wrapper
104116

pandas/tests/test_series.py

+7
Original file line numberDiff line numberDiff line change
@@ -1565,6 +1565,13 @@ def test_operators_empty_int_corner(self):
15651565
# it works!
15661566
_ = s1 * s2
15671567

1568+
def test_operators_datetime64(self):
1569+
v1 = date_range('2012-1-1', periods=3, freq='D')
1570+
v2 = date_range('2012-1-2', periods=3, freq='D')
1571+
rs = Series(v2) - Series(v1)
1572+
xp = Series(1e9 * 3600 * 24, rs.index).astype('timedelta64[ns]')
1573+
assert_series_equal(rs, xp)
1574+
15681575
# NumPy limitiation =(
15691576

15701577
# def test_logical_range_select(self):

0 commit comments

Comments
 (0)