Skip to content

Commit 83eb75b

Browse files
ianzurmroeschke
authored andcommitted
Datetime mergeasof tolerance (#28241)
* whatsnew * 🐛🔧 * BUG: convert datetime.timedelta to nanoseconds to fix (#28098) * BUG: mergeasof() now accepts datetime.timedelta as tolerance kwarg (#28098) * BUG: mergeasof() now accepts datetime.timedelta as tolerance kwarg (#28098) * BUG: mergeasof() now accepts datetime.timedelta as tolerance kwarg (#28098) * BUG: mergeasof() now accepts datetime.timedelta as tolerance kwarg (#28098) * don't change this file * CLN: sort imports * BUG: (#28098) changes * BUG (#28098) some more changes * update whatsnew * BUG: pass timedelta and datetime.timedelta to timedelta
1 parent 3ff57e0 commit 83eb75b

File tree

3 files changed

+6
-9
lines changed

3 files changed

+6
-9
lines changed

doc/source/whatsnew/v1.0.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ Reshaping
279279

280280
- Bug in :meth:`DataFrame.apply` that caused incorrect output with empty :class:`DataFrame` (:issue:`28202`, :issue:`21959`)
281281
- Bug in :meth:`DataFrame.stack` not handling non-unique indexes correctly when creating MultiIndex (:issue: `28301`)
282+
- Bug :func:`merge_asof` could not use :class:`datetime.timedelta` for ``tolerance`` kwarg (:issue:`28098`)
282283

283284
Sparse
284285
^^^^^^

pandas/core/reshape/merge.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"""
44

55
import copy
6+
import datetime
67
from functools import partial
78
import string
89
import warnings
@@ -1619,7 +1620,7 @@ def _get_merge_keys(self):
16191620
)
16201621
raise MergeError(msg)
16211622

1622-
# validate tolerance; must be a Timedelta if we have a DTI
1623+
# validate tolerance; datetime.timedelta or Timedelta if we have a DTI
16231624
if self.tolerance is not None:
16241625

16251626
if self.left_index:
@@ -1635,7 +1636,7 @@ def _get_merge_keys(self):
16351636
)
16361637

16371638
if is_datetimelike(lt):
1638-
if not isinstance(self.tolerance, Timedelta):
1639+
if not isinstance(self.tolerance, datetime.timedelta):
16391640
raise MergeError(msg)
16401641
if self.tolerance < Timedelta(0):
16411642
raise MergeError("tolerance must be positive")
@@ -1705,6 +1706,7 @@ def flip(xs):
17051706
left_values = left_values.view("i8")
17061707
right_values = right_values.view("i8")
17071708
if tolerance is not None:
1709+
tolerance = Timedelta(tolerance)
17081710
tolerance = tolerance.value
17091711

17101712
# a "by" parameter requires special handling

pandas/tests/reshape/merge/test_merge_asof.py

+1-7
Original file line numberDiff line numberDiff line change
@@ -592,13 +592,7 @@ def test_non_sorted(self):
592592

593593
@pytest.mark.parametrize(
594594
"tolerance",
595-
[
596-
Timedelta("1day"),
597-
pytest.param(
598-
datetime.timedelta(days=1),
599-
marks=pytest.mark.xfail(reason="not implemented", strict=True),
600-
),
601-
],
595+
[Timedelta("1day"), datetime.timedelta(days=1)],
602596
ids=["pd.Timedelta", "datetime.timedelta"],
603597
)
604598
def test_tolerance(self, tolerance):

0 commit comments

Comments
 (0)