Skip to content

Commit d5e4bc5

Browse files
jbrockmendeljreback
authored andcommitted
BUG: corner cases in DTI.get_value, Float64Index.get_value (#31163)
1 parent fff4f3f commit d5e4bc5

File tree

4 files changed

+55
-8
lines changed

4 files changed

+55
-8
lines changed

pandas/core/indexes/datetimes.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
from pandas.core.dtypes.common import _NS_DTYPE, is_float, is_integer, is_scalar
2020
from pandas.core.dtypes.dtypes import DatetimeTZDtype
21-
from pandas.core.dtypes.missing import isna
21+
from pandas.core.dtypes.missing import is_valid_nat_for_dtype
2222

2323
from pandas.core.accessor import delegate_names
2424
from pandas.core.arrays.datetimes import (
@@ -677,8 +677,8 @@ def get_loc(self, key, method=None, tolerance=None):
677677
-------
678678
loc : int
679679
"""
680-
if is_scalar(key) and isna(key):
681-
key = NaT # FIXME: do this systematically
680+
if is_valid_nat_for_dtype(key, self.dtype):
681+
key = NaT
682682

683683
if tolerance is not None:
684684
# try converting tolerance now, so errors don't get swallowed by

pandas/core/indexes/numeric.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -433,11 +433,7 @@ def get_value(self, series: "Series", key):
433433
raise InvalidIndexError
434434

435435
loc = self.get_loc(key)
436-
if not is_scalar(loc):
437-
return series.iloc[loc]
438-
439-
new_values = series._values[loc]
440-
return new_values
436+
return self._get_values_for_loc(series, loc)
441437

442438
def equals(self, other) -> bool:
443439
"""

pandas/tests/indexes/datetimes/test_indexing.py

+11
Original file line numberDiff line numberDiff line change
@@ -773,3 +773,14 @@ def test_get_loc_nat(self):
773773
# GH#20464
774774
index = DatetimeIndex(["1/3/2000", "NaT"])
775775
assert index.get_loc(pd.NaT) == 1
776+
777+
assert index.get_loc(None) == 1
778+
779+
assert index.get_loc(np.nan) == 1
780+
781+
assert index.get_loc(pd.NA) == 1
782+
783+
assert index.get_loc(np.datetime64("NaT")) == 1
784+
785+
with pytest.raises(KeyError, match="NaT"):
786+
index.get_loc(np.timedelta64("NaT"))

pandas/tests/indexes/test_numeric.py

+40
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,46 @@ def test_get_loc_missing_nan(self):
393393
# listlike/non-hashable raises TypeError
394394
idx.get_loc([np.nan])
395395

396+
@pytest.mark.parametrize(
397+
"vals",
398+
[
399+
pd.date_range("2016-01-01", periods=3),
400+
pd.timedelta_range("1 Day", periods=3),
401+
],
402+
)
403+
def test_lookups_datetimelike_values(self, vals):
404+
# If we have datetime64 or timedelta64 values, make sure they are
405+
# wrappped correctly
406+
ser = pd.Series(vals, index=range(3, 6))
407+
ser.index = ser.index.astype("float64")
408+
409+
expected = vals[1]
410+
411+
result = ser.index.get_value(ser, 4.0)
412+
assert isinstance(result, type(expected)) and result == expected
413+
result = ser.index.get_value(ser, 4)
414+
assert isinstance(result, type(expected)) and result == expected
415+
416+
result = ser[4.0]
417+
assert isinstance(result, type(expected)) and result == expected
418+
result = ser[4]
419+
assert isinstance(result, type(expected)) and result == expected
420+
421+
result = ser.loc[4.0]
422+
assert isinstance(result, type(expected)) and result == expected
423+
result = ser.loc[4]
424+
assert isinstance(result, type(expected)) and result == expected
425+
426+
result = ser.at[4.0]
427+
assert isinstance(result, type(expected)) and result == expected
428+
# Note: ser.at[4] raises ValueError; TODO: should we make this match loc?
429+
430+
result = ser.iloc[1]
431+
assert isinstance(result, type(expected)) and result == expected
432+
433+
result = ser.iat[1]
434+
assert isinstance(result, type(expected)) and result == expected
435+
396436
def test_contains_nans(self):
397437
i = Float64Index([1.0, 2.0, np.nan])
398438
assert np.nan in i

0 commit comments

Comments
 (0)