diff --git a/doc/source/whatsnew/v0.19.2.txt b/doc/source/whatsnew/v0.19.2.txt index 0567a3c3fa2bb..cdbfc3001d9a4 100644 --- a/doc/source/whatsnew/v0.19.2.txt +++ b/doc/source/whatsnew/v0.19.2.txt @@ -74,5 +74,6 @@ Bug Fixes - Bug in ``pd.read_csv()`` in which the ``nrows`` parameter was not being respected for large input when using the C engine for parsing (:issue:`7626`) +- Bug in ``pd.merge_asof()`` could not handle timezone-aware DatetimeIndex when a tolerance was specified (:issue:`14844`) - Explicit check in ``to_stata`` and ``StataWriter`` for out-of-range values when writing doubles (:issue:`14618`) diff --git a/pandas/tools/merge.py b/pandas/tools/merge.py index 8d2f92ad58a88..68953c90676dd 100644 --- a/pandas/tools/merge.py +++ b/pandas/tools/merge.py @@ -1021,7 +1021,7 @@ def _get_merge_keys(self): msg = "incompatible tolerance, must be compat " \ "with type {0}".format(type(lt)) - if is_datetime64_dtype(lt): + if is_datetime64_dtype(lt) or is_datetime64tz_dtype(lt): if not isinstance(self.tolerance, Timedelta): raise MergeError(msg) if self.tolerance < Timedelta(0): @@ -1034,7 +1034,7 @@ def _get_merge_keys(self): raise MergeError("tolerance must be positive") else: - raise MergeError(msg) + raise MergeError("key must be integer or timestamp") # validate allow_exact_matches if not is_bool(self.allow_exact_matches): diff --git a/pandas/tools/tests/test_merge_asof.py b/pandas/tools/tests/test_merge_asof.py index f413618624592..1e6031079d59b 100644 --- a/pandas/tools/tests/test_merge_asof.py +++ b/pandas/tools/tests/test_merge_asof.py @@ -293,6 +293,30 @@ def test_tolerance(self): expected = self.tolerance assert_frame_equal(result, expected) + def test_tolerance_tz(self): + # GH 14844 + import pytz + left = pd.DataFrame( + {'date': pd.DatetimeIndex(start=pd.to_datetime('2016-01-02'), + freq='D', periods=5, + tz=pytz.timezone('UTC')), + 'value1': np.arange(5)}) + right = pd.DataFrame( + {'date': pd.DatetimeIndex(start=pd.to_datetime('2016-01-01'), + freq='D', periods=5, + tz=pytz.timezone('UTC')), + 'value2': list("ABCDE")}) + result = pd.merge_asof(left, right, on='date', + tolerance=pd.Timedelta('1 day')) + + expected = pd.DataFrame( + {'date': pd.DatetimeIndex(start=pd.to_datetime('2016-01-02'), + freq='D', periods=5, + tz=pytz.timezone('UTC')), + 'value1': np.arange(5), + 'value2': list("BCDEE")}) + assert_frame_equal(result, expected) + def test_allow_exact_matches(self): result = merge_asof(self.trades, self.quotes,