diff --git a/doc/source/whatsnew/v1.0.0.rst b/doc/source/whatsnew/v1.0.0.rst index 7ca93d7d75854..a3d75d69e1e82 100644 --- a/doc/source/whatsnew/v1.0.0.rst +++ b/doc/source/whatsnew/v1.0.0.rst @@ -279,6 +279,7 @@ Reshaping - Bug in :meth:`DataFrame.apply` that caused incorrect output with empty :class:`DataFrame` (:issue:`28202`, :issue:`21959`) - Bug in :meth:`DataFrame.stack` not handling non-unique indexes correctly when creating MultiIndex (:issue: `28301`) +- Bug :func:`merge_asof` could not use :class:`datetime.timedelta` for ``tolerance`` kwarg (:issue:`28098`) Sparse ^^^^^^ diff --git a/pandas/core/reshape/merge.py b/pandas/core/reshape/merge.py index d7fbe464cb1e5..62a30073a53fd 100644 --- a/pandas/core/reshape/merge.py +++ b/pandas/core/reshape/merge.py @@ -3,6 +3,7 @@ """ import copy +import datetime from functools import partial import string import warnings @@ -1619,7 +1620,7 @@ def _get_merge_keys(self): ) raise MergeError(msg) - # validate tolerance; must be a Timedelta if we have a DTI + # validate tolerance; datetime.timedelta or Timedelta if we have a DTI if self.tolerance is not None: if self.left_index: @@ -1635,7 +1636,7 @@ def _get_merge_keys(self): ) if is_datetimelike(lt): - if not isinstance(self.tolerance, Timedelta): + if not isinstance(self.tolerance, datetime.timedelta): raise MergeError(msg) if self.tolerance < Timedelta(0): raise MergeError("tolerance must be positive") @@ -1705,6 +1706,7 @@ def flip(xs): left_values = left_values.view("i8") right_values = right_values.view("i8") if tolerance is not None: + tolerance = Timedelta(tolerance) tolerance = tolerance.value # a "by" parameter requires special handling diff --git a/pandas/tests/reshape/merge/test_merge_asof.py b/pandas/tests/reshape/merge/test_merge_asof.py index 7412b1de643a1..caf2539a9e150 100644 --- a/pandas/tests/reshape/merge/test_merge_asof.py +++ b/pandas/tests/reshape/merge/test_merge_asof.py @@ -592,13 +592,7 @@ def test_non_sorted(self): @pytest.mark.parametrize( "tolerance", - [ - Timedelta("1day"), - pytest.param( - datetime.timedelta(days=1), - marks=pytest.mark.xfail(reason="not implemented", strict=True), - ), - ], + [Timedelta("1day"), datetime.timedelta(days=1)], ids=["pd.Timedelta", "datetime.timedelta"], ) def test_tolerance(self, tolerance):