|
| 1 | +import datetime |
| 2 | + |
1 | 3 | import numpy as np
|
2 | 4 | import pytest
|
3 | 5 | import pytz
|
@@ -588,14 +590,23 @@ def test_non_sorted(self):
|
588 | 590 | # ok, though has dupes
|
589 | 591 | merge_asof(trades, self.quotes, on="time", by="ticker")
|
590 | 592 |
|
591 |
| - def test_tolerance(self): |
| 593 | + @pytest.mark.parametrize( |
| 594 | + "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 | + ], |
| 602 | + ids=["pd.Timedelta", "datetime.timedelta"], |
| 603 | + ) |
| 604 | + def test_tolerance(self, tolerance): |
592 | 605 |
|
593 | 606 | trades = self.trades
|
594 | 607 | quotes = self.quotes
|
595 | 608 |
|
596 |
| - result = merge_asof( |
597 |
| - trades, quotes, on="time", by="ticker", tolerance=Timedelta("1day") |
598 |
| - ) |
| 609 | + result = merge_asof(trades, quotes, on="time", by="ticker", tolerance=tolerance) |
599 | 610 | expected = self.tolerance
|
600 | 611 | assert_frame_equal(result, expected)
|
601 | 612 |
|
@@ -1246,3 +1257,39 @@ def test_by_mixed_tz_aware(self):
|
1246 | 1257 | )
|
1247 | 1258 | expected["value_y"] = np.array([np.nan], dtype=object)
|
1248 | 1259 | assert_frame_equal(result, expected)
|
| 1260 | + |
| 1261 | + def test_timedelta_tolerance_nearest(self): |
| 1262 | + # GH 27642 |
| 1263 | + |
| 1264 | + left = pd.DataFrame( |
| 1265 | + list(zip([0, 5, 10, 15, 20, 25], [0, 1, 2, 3, 4, 5])), |
| 1266 | + columns=["time", "left"], |
| 1267 | + ) |
| 1268 | + |
| 1269 | + left["time"] = pd.to_timedelta(left["time"], "ms") |
| 1270 | + |
| 1271 | + right = pd.DataFrame( |
| 1272 | + list(zip([0, 3, 9, 12, 15, 18], [0, 1, 2, 3, 4, 5])), |
| 1273 | + columns=["time", "right"], |
| 1274 | + ) |
| 1275 | + |
| 1276 | + right["time"] = pd.to_timedelta(right["time"], "ms") |
| 1277 | + |
| 1278 | + expected = pd.DataFrame( |
| 1279 | + list( |
| 1280 | + zip( |
| 1281 | + [0, 5, 10, 15, 20, 25], |
| 1282 | + [0, 1, 2, 3, 4, 5], |
| 1283 | + [0, np.nan, 2, 4, np.nan, np.nan], |
| 1284 | + ) |
| 1285 | + ), |
| 1286 | + columns=["time", "left", "right"], |
| 1287 | + ) |
| 1288 | + |
| 1289 | + expected["time"] = pd.to_timedelta(expected["time"], "ms") |
| 1290 | + |
| 1291 | + result = pd.merge_asof( |
| 1292 | + left, right, on="time", tolerance=Timedelta("1ms"), direction="nearest" |
| 1293 | + ) |
| 1294 | + |
| 1295 | + assert_frame_equal(result, expected) |
0 commit comments