Skip to content

Commit 8b01fe3

Browse files
committed
Fix #17965 to allow full comparison of datetimelike objects
1 parent dbed28b commit 8b01fe3

File tree

3 files changed

+25
-2
lines changed

3 files changed

+25
-2
lines changed

doc/source/whatsnew/v0.21.1.txt

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ Bug Fixes
6161
- Bug in :class:`DatetimeIndex` subtracting datetimelike from DatetimeIndex could fail to overflow (:issue:`18020`)
6262
- Bug in ``pd.Series.rolling.skew()`` and ``rolling.kurt()`` with all equal values has floating issue (:issue:`18044`)
6363
- Bug in ``pd.DataFrameGroupBy.count()`` when counting over a datetimelike column (:issue:`13393`)
64+
- Bug in ``_libs.index.convert_scalar()``: Comparison between ``datetime64[ns]`` series and ``datetimelike`` (:issue:`17965`)
6465

6566
Conversion
6667
^^^^^^^^^^

pandas/_libs/index.pyx

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ from hashtable cimport HashTable
1919

2020
from pandas._libs import algos, period as periodlib, hashtable as _hash
2121
from pandas._libs.tslib import Timestamp, Timedelta
22-
from datetime import datetime, timedelta
22+
from datetime import datetime, timedelta, date
2323

2424
from cpython cimport PyTuple_Check, PyList_Check
2525

@@ -549,7 +549,7 @@ cpdef convert_scalar(ndarray arr, object value):
549549
if arr.descr.type_num == NPY_DATETIME:
550550
if isinstance(value, np.ndarray):
551551
pass
552-
elif isinstance(value, datetime):
552+
elif isinstance(value, (np.datetime64, datetime, date)):
553553
return Timestamp(value).value
554554
elif value is None or value != value:
555555
return iNaT

pandas/tests/indexes/datetimes/test_partial_slicing.py

+22
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from datetime import datetime
66
import numpy as np
77
import pandas as pd
8+
from itertools import product
9+
import operator as op
810

911
from pandas import (DatetimeIndex, Series, DataFrame,
1012
date_range, Index, Timedelta, Timestamp)
@@ -330,3 +332,23 @@ def test_loc_datetime_length_one(self):
330332

331333
result = df.loc['2016-10-01T00:00:00':]
332334
tm.assert_frame_equal(result, df)
335+
336+
comparisonTS = Timestamp('20130101')
337+
338+
@pytest.mark.parametrize('datetimelike,opExp', product(
339+
[comparisonTS, comparisonTS.to_pydatetime(),
340+
comparisonTS.to_pydatetime().date(), comparisonTS.to_datetime64()],
341+
[(op.lt, [True, False, False, False]),
342+
(op.le, [True, True, False, False]),
343+
(op.eq, [False, True, False, False]),
344+
(op.gt, [False, False, False, True])]))
345+
def test_selection_by_datetimelike(self, datetimelike, opExp):
346+
# GH issue #17965, test for ability to compare datetime64[ns] columns
347+
# to datetimelike
348+
op, exp = opExp
349+
df = DataFrame({'A': [pd.Timestamp('20120101'),
350+
pd.Timestamp('20130101'),
351+
np.nan, pd.Timestamp('20130103')]})
352+
result = op(df.A, datetimelike)
353+
expected = Series(exp, name='A')
354+
tm.assert_series_equal(result, expected)

0 commit comments

Comments
 (0)