236 lines
6.9 KiB
Python
236 lines
6.9 KiB
Python
"""
|
|
Tests for offsets.BDay
|
|
"""
|
|
from datetime import (
|
|
date,
|
|
datetime,
|
|
timedelta,
|
|
)
|
|
|
|
import numpy as np
|
|
import pytest
|
|
|
|
from pandas._libs.tslibs.offsets import (
|
|
ApplyTypeError,
|
|
BDay,
|
|
BMonthEnd,
|
|
)
|
|
|
|
from pandas import (
|
|
DatetimeIndex,
|
|
Timedelta,
|
|
_testing as tm,
|
|
)
|
|
from pandas.tests.tseries.offsets.common import (
|
|
Base,
|
|
assert_is_on_offset,
|
|
assert_offset_equal,
|
|
)
|
|
from pandas.tests.tseries.offsets.test_offsets import _ApplyCases
|
|
|
|
from pandas.tseries import offsets as offsets
|
|
|
|
|
|
class TestBusinessDay(Base):
|
|
_offset = BDay
|
|
|
|
def setup_method(self, method):
|
|
self.d = datetime(2008, 1, 1)
|
|
self.nd = np.datetime64("2008-01-01 00:00:00")
|
|
|
|
self.offset = self._offset()
|
|
self.offset1 = self.offset
|
|
self.offset2 = self._offset(2)
|
|
|
|
def test_different_normalize_equals(self):
|
|
# GH#21404 changed __eq__ to return False when `normalize` does not match
|
|
offset = self._offset()
|
|
offset2 = self._offset(normalize=True)
|
|
assert offset != offset2
|
|
|
|
def test_repr(self):
|
|
assert repr(self.offset) == "<BusinessDay>"
|
|
assert repr(self.offset2) == "<2 * BusinessDays>"
|
|
|
|
expected = "<BusinessDay: offset=datetime.timedelta(days=1)>"
|
|
assert repr(self.offset + timedelta(1)) == expected
|
|
|
|
def test_with_offset(self):
|
|
offset = self.offset + timedelta(hours=2)
|
|
|
|
assert (self.d + offset) == datetime(2008, 1, 2, 2)
|
|
|
|
@pytest.mark.parametrize(
|
|
"td",
|
|
[
|
|
Timedelta(hours=2),
|
|
Timedelta(hours=2).to_pytimedelta(),
|
|
Timedelta(hours=2).to_timedelta64(),
|
|
],
|
|
ids=lambda x: type(x),
|
|
)
|
|
def test_with_offset_index(self, td):
|
|
|
|
dti = DatetimeIndex([self.d])
|
|
expected = DatetimeIndex([datetime(2008, 1, 2, 2)])
|
|
|
|
result = dti + (td + self.offset)
|
|
tm.assert_index_equal(result, expected)
|
|
|
|
result = dti + (self.offset + td)
|
|
tm.assert_index_equal(result, expected)
|
|
|
|
def test_eq(self):
|
|
assert self.offset2 == self.offset2
|
|
|
|
def test_mul(self):
|
|
pass
|
|
|
|
def test_hash(self):
|
|
assert hash(self.offset2) == hash(self.offset2)
|
|
|
|
def test_call(self):
|
|
with tm.assert_produces_warning(FutureWarning):
|
|
# GH#34171 DateOffset.__call__ is deprecated
|
|
assert self.offset2(self.d) == datetime(2008, 1, 3)
|
|
assert self.offset2(self.nd) == datetime(2008, 1, 3)
|
|
|
|
def testRollback1(self):
|
|
assert self._offset(10).rollback(self.d) == self.d
|
|
|
|
def testRollback2(self):
|
|
assert self._offset(10).rollback(datetime(2008, 1, 5)) == datetime(2008, 1, 4)
|
|
|
|
def testRollforward1(self):
|
|
assert self._offset(10).rollforward(self.d) == self.d
|
|
|
|
def testRollforward2(self):
|
|
assert self._offset(10).rollforward(datetime(2008, 1, 5)) == datetime(
|
|
2008, 1, 7
|
|
)
|
|
|
|
def test_roll_date_object(self):
|
|
offset = self._offset()
|
|
|
|
dt = date(2012, 9, 15)
|
|
|
|
result = offset.rollback(dt)
|
|
assert result == datetime(2012, 9, 14)
|
|
|
|
result = offset.rollforward(dt)
|
|
assert result == datetime(2012, 9, 17)
|
|
|
|
offset = offsets.Day()
|
|
result = offset.rollback(dt)
|
|
assert result == datetime(2012, 9, 15)
|
|
|
|
result = offset.rollforward(dt)
|
|
assert result == datetime(2012, 9, 15)
|
|
|
|
def test_is_on_offset(self):
|
|
tests = [
|
|
(self._offset(), datetime(2008, 1, 1), True),
|
|
(self._offset(), datetime(2008, 1, 5), False),
|
|
]
|
|
|
|
for offset, d, expected in tests:
|
|
assert_is_on_offset(offset, d, expected)
|
|
|
|
apply_cases: _ApplyCases = [
|
|
(
|
|
1,
|
|
{
|
|
datetime(2008, 1, 1): datetime(2008, 1, 2),
|
|
datetime(2008, 1, 4): datetime(2008, 1, 7),
|
|
datetime(2008, 1, 5): datetime(2008, 1, 7),
|
|
datetime(2008, 1, 6): datetime(2008, 1, 7),
|
|
datetime(2008, 1, 7): datetime(2008, 1, 8),
|
|
},
|
|
),
|
|
(
|
|
2,
|
|
{
|
|
datetime(2008, 1, 1): datetime(2008, 1, 3),
|
|
datetime(2008, 1, 4): datetime(2008, 1, 8),
|
|
datetime(2008, 1, 5): datetime(2008, 1, 8),
|
|
datetime(2008, 1, 6): datetime(2008, 1, 8),
|
|
datetime(2008, 1, 7): datetime(2008, 1, 9),
|
|
},
|
|
),
|
|
(
|
|
-1,
|
|
{
|
|
datetime(2008, 1, 1): datetime(2007, 12, 31),
|
|
datetime(2008, 1, 4): datetime(2008, 1, 3),
|
|
datetime(2008, 1, 5): datetime(2008, 1, 4),
|
|
datetime(2008, 1, 6): datetime(2008, 1, 4),
|
|
datetime(2008, 1, 7): datetime(2008, 1, 4),
|
|
datetime(2008, 1, 8): datetime(2008, 1, 7),
|
|
},
|
|
),
|
|
(
|
|
-2,
|
|
{
|
|
datetime(2008, 1, 1): datetime(2007, 12, 28),
|
|
datetime(2008, 1, 4): datetime(2008, 1, 2),
|
|
datetime(2008, 1, 5): datetime(2008, 1, 3),
|
|
datetime(2008, 1, 6): datetime(2008, 1, 3),
|
|
datetime(2008, 1, 7): datetime(2008, 1, 3),
|
|
datetime(2008, 1, 8): datetime(2008, 1, 4),
|
|
datetime(2008, 1, 9): datetime(2008, 1, 7),
|
|
},
|
|
),
|
|
(
|
|
0,
|
|
{
|
|
datetime(2008, 1, 1): datetime(2008, 1, 1),
|
|
datetime(2008, 1, 4): datetime(2008, 1, 4),
|
|
datetime(2008, 1, 5): datetime(2008, 1, 7),
|
|
datetime(2008, 1, 6): datetime(2008, 1, 7),
|
|
datetime(2008, 1, 7): datetime(2008, 1, 7),
|
|
},
|
|
),
|
|
]
|
|
|
|
@pytest.mark.parametrize("case", apply_cases)
|
|
def test_apply(self, case):
|
|
n, cases = case
|
|
offset = self._offset(n)
|
|
for base, expected in cases.items():
|
|
assert_offset_equal(offset, base, expected)
|
|
|
|
def test_apply_large_n(self):
|
|
dt = datetime(2012, 10, 23)
|
|
|
|
result = dt + self._offset(10)
|
|
assert result == datetime(2012, 11, 6)
|
|
|
|
result = dt + self._offset(100) - self._offset(100)
|
|
assert result == dt
|
|
|
|
off = self._offset() * 6
|
|
rs = datetime(2012, 1, 1) - off
|
|
xp = datetime(2011, 12, 23)
|
|
assert rs == xp
|
|
|
|
st = datetime(2011, 12, 18)
|
|
rs = st + off
|
|
xp = datetime(2011, 12, 26)
|
|
assert rs == xp
|
|
|
|
off = self._offset() * 10
|
|
rs = datetime(2014, 1, 5) + off # see #5890
|
|
xp = datetime(2014, 1, 17)
|
|
assert rs == xp
|
|
|
|
def test_apply_corner(self):
|
|
if self._offset is BDay:
|
|
msg = "Only know how to combine business day with datetime or timedelta"
|
|
else:
|
|
msg = (
|
|
"Only know how to combine trading day "
|
|
"with datetime, datetime64 or timedelta"
|
|
)
|
|
with pytest.raises(ApplyTypeError, match=msg):
|
|
self._offset()._apply(BMonthEnd())
|