Skip to content

Commit 217413a

Browse files
Backport PR #32905 on branch 1.0.x (Fix to _get_nearest_indexer for pydata/xarray#3751) (#34025)
Co-authored-by: Spencer Clark <[email protected]>
1 parent 2544c3a commit 217413a

File tree

5 files changed

+23
-4
lines changed

5 files changed

+23
-4
lines changed

doc/source/whatsnew/v1.0.4.rst

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Fixed regressions
2121
- Fix performance regression in ``memory_usage(deep=True)`` for object dtype (:issue:`33012`)
2222
- Bug where :meth:`Categorical.replace` would replace with ``NaN`` whenever the new value and replacement value were equal (:issue:`33288`)
2323
- Bug where an ordered :class:`Categorical` containing only ``NaN`` values would raise rather than returning ``NaN`` when taking the minimum or maximum (:issue:`33450`)
24+
- Fix to preserve the ability to index with the "nearest" method with xarray's CFTimeIndex, an :class:`Index` subclass (`pydata/xarray#3751 <https://github.com/pydata/xarray/issues/3751>`_, :issue:`32905`).
2425
-
2526

2627
.. _whatsnew_104.bug_fixes:

environment.yml

+1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ dependencies:
102102
- s3fs # pandas.read_csv... when using 's3://...' path
103103
- sqlalchemy # pandas.read_sql, DataFrame.to_sql
104104
- xarray # DataFrame.to_xarray
105+
- cftime # Needed for downstream xarray.CFTimeIndex test
105106
- pyreadstat # pandas.read_spss
106107
- tabulate>=0.8.3 # DataFrame.to_markdown
107108
- pip:

pandas/core/indexes/base.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -2817,8 +2817,9 @@ def _get_nearest_indexer(self, target, limit, tolerance):
28172817
left_indexer = self.get_indexer(target, "pad", limit=limit)
28182818
right_indexer = self.get_indexer(target, "backfill", limit=limit)
28192819

2820-
left_distances = np.abs(self[left_indexer] - target)
2821-
right_distances = np.abs(self[right_indexer] - target)
2820+
target_values = target._values
2821+
left_distances = np.abs(self._values[left_indexer] - target_values)
2822+
right_distances = np.abs(self._values[right_indexer] - target_values)
28222823

28232824
op = operator.lt if self.is_monotonic_increasing else operator.le
28242825
indexer = np.where(
@@ -2827,11 +2828,11 @@ def _get_nearest_indexer(self, target, limit, tolerance):
28272828
right_indexer,
28282829
)
28292830
if tolerance is not None:
2830-
indexer = self._filter_indexer_tolerance(target, indexer, tolerance)
2831+
indexer = self._filter_indexer_tolerance(target_values, indexer, tolerance)
28312832
return indexer
28322833

28332834
def _filter_indexer_tolerance(self, target, indexer, tolerance):
2834-
distance = abs(self.values[indexer] - target)
2835+
distance = abs(self._values[indexer] - target)
28352836
indexer = np.where(distance <= tolerance, indexer, -1)
28362837
return indexer
28372838

pandas/tests/test_downstream.py

+15
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import numpy as np # noqa
99
import pytest
1010

11+
import pandas.util._test_decorators as td
12+
1113
from pandas import DataFrame, Series
1214
import pandas._testing as tm
1315

@@ -47,6 +49,19 @@ def test_xarray(df):
4749
assert df.to_xarray() is not None
4850

4951

52+
@td.skip_if_no("cftime")
53+
@td.skip_if_no("xarray", "0.10.4")
54+
def test_xarray_cftimeindex_nearest():
55+
# https://github.com/pydata/xarray/issues/3751
56+
import cftime
57+
import xarray
58+
59+
times = xarray.cftime_range("0001", periods=2)
60+
result = times.get_loc(cftime.DatetimeGregorian(2000, 1, 1), method="nearest")
61+
expected = 1
62+
assert result == expected
63+
64+
5065
def test_oo_optimizable():
5166
# GH 21071
5267
subprocess.check_call([sys.executable, "-OO", "-c", "import pandas"])

requirements-dev.txt

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ tables>=3.4.2
6969
s3fs
7070
sqlalchemy
7171
xarray
72+
cftime
7273
pyreadstat
7374
tabulate>=0.8.3
7475
git+https://github.com/pandas-dev/pydata-sphinx-theme.git@master

0 commit comments

Comments
 (0)