Skip to content

Commit 97b73a8

Browse files
author
Christopher C. Aycock
committed
BUG: Allow TZ-aware DatetimeIndex in merge_asof() (pandas-dev#14844)
1 parent 0699c89 commit 97b73a8

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

doc/source/whatsnew/v0.19.2.txt

+1
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,6 @@ Bug Fixes
7474
- 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`)
7575

7676

77+
- Bug in ``pd.merge_asof()`` could not handle timezone-aware DatetimeIndex when a tolerance was specified (:issue:`14844`)
7778

7879
- Explicit check in ``to_stata`` and ``StataWriter`` for out-of-range values when writing doubles (:issue:`14618`)

pandas/tools/merge.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1021,7 +1021,7 @@ def _get_merge_keys(self):
10211021
msg = "incompatible tolerance, must be compat " \
10221022
"with type {0}".format(type(lt))
10231023

1024-
if is_datetime64_dtype(lt):
1024+
if is_datetime64_dtype(lt) or is_datetime64tz_dtype(lt):
10251025
if not isinstance(self.tolerance, Timedelta):
10261026
raise MergeError(msg)
10271027
if self.tolerance < Timedelta(0):
@@ -1034,7 +1034,7 @@ def _get_merge_keys(self):
10341034
raise MergeError("tolerance must be positive")
10351035

10361036
else:
1037-
raise MergeError(msg)
1037+
raise MergeError("key must be integer or timestamp")
10381038

10391039
# validate allow_exact_matches
10401040
if not is_bool(self.allow_exact_matches):

pandas/tools/tests/test_merge_asof.py

+24
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,30 @@ def test_tolerance(self):
293293
expected = self.tolerance
294294
assert_frame_equal(result, expected)
295295

296+
def test_tolerance_tz(self):
297+
# GH 14844
298+
import pytz
299+
left = pd.DataFrame(
300+
{'date': pd.DatetimeIndex(start=pd.to_datetime('2016-01-02'),
301+
freq='D', periods=5,
302+
tz=pytz.timezone('UTC')),
303+
'value1': np.arange(5)})
304+
right = pd.DataFrame(
305+
{'date': pd.DatetimeIndex(start=pd.to_datetime('2016-01-01'),
306+
freq='D', periods=5,
307+
tz=pytz.timezone('UTC')),
308+
'value2': list("ABCDE")})
309+
result = pd.merge_asof(left, right, on='date',
310+
tolerance=pd.Timedelta('1 day'))
311+
312+
expected = pd.DataFrame(
313+
{'date': pd.DatetimeIndex(start=pd.to_datetime('2016-01-02'),
314+
freq='D', periods=5,
315+
tz=pytz.timezone('UTC')),
316+
'value1': np.arange(5),
317+
'value2': list("BCDEE")})
318+
assert_frame_equal(result, expected)
319+
296320
def test_allow_exact_matches(self):
297321

298322
result = merge_asof(self.trades, self.quotes,

0 commit comments

Comments
 (0)