Skip to content

Commit e74efb8

Browse files
ianzurNico Cernek
authored and
Nico Cernek
committed
Datetime mergeasof tolerance (pandas-dev#28241)
* whatsnew * 🐛🔧 * BUG: convert datetime.timedelta to nanoseconds to fix (pandas-dev#28098) * BUG: mergeasof() now accepts datetime.timedelta as tolerance kwarg (pandas-dev#28098) * BUG: mergeasof() now accepts datetime.timedelta as tolerance kwarg (pandas-dev#28098) * BUG: mergeasof() now accepts datetime.timedelta as tolerance kwarg (pandas-dev#28098) * BUG: mergeasof() now accepts datetime.timedelta as tolerance kwarg (pandas-dev#28098) * don't change this file * CLN: sort imports * BUG: (pandas-dev#28098) changes * BUG (pandas-dev#28098) some more changes * update whatsnew * BUG: pass timedelta and datetime.timedelta to timedelta
1 parent df3f16a commit e74efb8

File tree

3 files changed

+6
-10
lines changed

3 files changed

+6
-10
lines changed

doc/source/whatsnew/v1.0.0.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ Reshaping
281281
- Bug in :meth:`DataFrame.apply` that caused incorrect output with empty :class:`DataFrame` (:issue:`28202`, :issue:`21959`)
282282
- Bug in :meth:`DataFrame.stack` not handling non-unique indexes correctly when creating MultiIndex (:issue: `28301`)
283283
- :meth:`DataFrame.merge` now preserves right frame's row order when executing a right merge (:issue:`27453`)
284-
-
284+
- Bug :func:`merge_asof` could not use :class:`datetime.timedelta` for ``tolerance`` kwarg (:issue:`28098`)
285285

286286
Sparse
287287
^^^^^^

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
@@ -1624,7 +1625,7 @@ def _get_merge_keys(self):
16241625
)
16251626
raise MergeError(msg)
16261627

1627-
# validate tolerance; must be a Timedelta if we have a DTI
1628+
# validate tolerance; datetime.timedelta or Timedelta if we have a DTI
16281629
if self.tolerance is not None:
16291630

16301631
if self.left_index:
@@ -1640,7 +1641,7 @@ def _get_merge_keys(self):
16401641
)
16411642

16421643
if is_datetimelike(lt):
1643-
if not isinstance(self.tolerance, Timedelta):
1644+
if not isinstance(self.tolerance, datetime.timedelta):
16441645
raise MergeError(msg)
16451646
if self.tolerance < Timedelta(0):
16461647
raise MergeError("tolerance must be positive")
@@ -1710,6 +1711,7 @@ def flip(xs):
17101711
left_values = left_values.view("i8")
17111712
right_values = right_values.view("i8")
17121713
if tolerance is not None:
1714+
tolerance = Timedelta(tolerance)
17131715
tolerance = tolerance.value
17141716

17151717
# 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)