Skip to content

Commit f48e659

Browse files
committed
Merge pull request #5303 from jreback/isin
BUG: Fix Series.isin with date/time-like dtypes (GH5021)
2 parents ee0c92c + 94e44e7 commit f48e659

File tree

3 files changed

+47
-2
lines changed

3 files changed

+47
-2
lines changed

doc/source/release.rst

+1
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,7 @@ Bug Fixes
633633
- Fixed issue with ``drop`` and a non-unique index on Series (:issue:`5248`)
634634
- Fixed seg fault in C parser caused by passing more names than columns in
635635
the file. (:issue:`5156`)
636+
- Fix ``Series.isin`` with date/time-like dtypes (:issue:`5021`)
636637

637638
pandas 0.12.0
638639
-------------

pandas/core/series.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -2077,8 +2077,20 @@ def isin(self, values):
20772077
raise TypeError("only list-like objects are allowed to be passed"
20782078
" to Series.isin(), you passed a "
20792079
"{0!r}".format(type(values).__name__))
2080+
2081+
# may need i8 conversion for proper membership testing
2082+
comps = _values_from_object(self)
2083+
if com.is_datetime64_dtype(self):
2084+
from pandas.tseries.tools import to_datetime
2085+
values = Series(to_datetime(values)).values.view('i8')
2086+
comps = comps.view('i8')
2087+
elif com.is_timedelta64_dtype(self):
2088+
from pandas.tseries.timedeltas import to_timedelta
2089+
values = Series(to_timedelta(values)).values.view('i8')
2090+
comps = comps.view('i8')
2091+
20802092
value_set = set(values)
2081-
result = lib.ismember(_values_from_object(self), value_set)
2093+
result = lib.ismember(comps, value_set)
20822094
return self._constructor(result, index=self.index).__finalize__(self)
20832095

20842096
def between(self, left, right, inclusive=True):

pandas/tests/test_series.py

+33-1
Original file line numberDiff line numberDiff line change
@@ -4840,7 +4840,7 @@ def test_isin(self):
48404840
assert_series_equal(result, expected)
48414841

48424842
def test_isin_with_string_scalar(self):
4843-
#GH4763
4843+
# GH4763
48444844
s = Series(['A', 'B', 'C', 'a', 'B', 'B', 'A', 'C'])
48454845
with tm.assertRaises(TypeError):
48464846
s.isin('a')
@@ -4849,6 +4849,38 @@ def test_isin_with_string_scalar(self):
48494849
s = Series(['aaa', 'b', 'c'])
48504850
s.isin('aaa')
48514851

4852+
def test_isin_with_i8(self):
4853+
# GH 5021
4854+
4855+
expected = Series([True,True,False,False,False])
4856+
expected2 = Series([False,True,False,False,False])
4857+
4858+
# datetime64[ns]
4859+
s = Series(date_range('jan-01-2013','jan-05-2013'))
4860+
4861+
result = s.isin(s[0:2])
4862+
assert_series_equal(result, expected)
4863+
4864+
result = s.isin(s[0:2].values)
4865+
assert_series_equal(result, expected)
4866+
4867+
# fails on dtype conversion in the first place
4868+
if not _np_version_under1p7:
4869+
result = s.isin(s[0:2].values.astype('datetime64[D]'))
4870+
assert_series_equal(result, expected)
4871+
4872+
result = s.isin([s[1]])
4873+
assert_series_equal(result, expected2)
4874+
4875+
result = s.isin([np.datetime64(s[1])])
4876+
assert_series_equal(result, expected2)
4877+
4878+
# timedelta64[ns]
4879+
if not _np_version_under1p7:
4880+
s = Series(pd.to_timedelta(lrange(5),unit='d'))
4881+
result = s.isin(s[0:2])
4882+
assert_series_equal(result, expected)
4883+
48524884
#------------------------------------------------------------------------------
48534885
# TimeSeries-specific
48544886
def test_cummethods_bool(self):

0 commit comments

Comments
 (0)