BUG: Allow TZ-aware DatetimeIndex in merge_asof() (#14844)
closes #14844 Author: Christopher C. Aycock <christopher.aycock@twosigma.com> Closes #14845 from chrisaycock/GH14844 and squashes the following commits:97b73a8
[Christopher C. Aycock] BUG: Allow TZ-aware DatetimeIndex in merge_asof() (#14844) (cherry picked from commite991141f3c
)
This commit is contained in:
parent
1bc64b1f5c
commit
7f53ea8fac
|
@ -74,6 +74,7 @@ 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`)
|
||||
|
||||
|
|
|
@ -1021,7 +1021,7 @@ class _AsOfMerge(_OrderedMerge):
|
|||
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 @@ class _AsOfMerge(_OrderedMerge):
|
|||
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):
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import nose
|
||||
import os
|
||||
|
||||
import pytz
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
from pandas import (merge_asof, read_csv,
|
||||
|
@ -293,6 +294,29 @@ class TestAsOfMerge(tm.TestCase):
|
|||
expected = self.tolerance
|
||||
assert_frame_equal(result, expected)
|
||||
|
||||
def test_tolerance_tz(self):
|
||||
# GH 14844
|
||||
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,
|
||||
|
|
Loading…
Reference in New Issue