|
2 | 2 | Tests for offsets.CustomBusinessDay / CDay
|
3 | 3 | """
|
4 | 4 | from datetime import (
|
5 |
| - date, |
6 | 5 | datetime,
|
7 | 6 | timedelta,
|
8 | 7 | )
|
9 | 8 |
|
10 | 9 | import numpy as np
|
11 | 10 | import pytest
|
12 | 11 |
|
13 |
| -from pandas._libs.tslibs.offsets import ( |
14 |
| - ApplyTypeError, |
15 |
| - BMonthEnd, |
16 |
| - CDay, |
17 |
| -) |
18 |
| -from pandas.compat import np_datetime64_compat |
| 12 | +from pandas._libs.tslibs.offsets import CDay |
19 | 13 |
|
20 | 14 | from pandas import (
|
21 |
| - DatetimeIndex, |
22 |
| - Timedelta, |
23 | 15 | _testing as tm,
|
24 | 16 | read_pickle,
|
25 | 17 | )
|
26 |
| -from pandas.tests.tseries.offsets.common import ( |
27 |
| - Base, |
28 |
| - assert_is_on_offset, |
29 |
| - assert_offset_equal, |
30 |
| -) |
31 |
| -from pandas.tests.tseries.offsets.test_offsets import _ApplyCases |
| 18 | +from pandas.tests.tseries.offsets.common import assert_offset_equal |
| 19 | +from pandas.tests.tseries.offsets.test_business_day import TestBusinessDay |
32 | 20 |
|
33 |
| -from pandas.tseries import offsets as offsets |
34 | 21 | from pandas.tseries.holiday import USFederalHolidayCalendar
|
35 | 22 |
|
36 | 23 |
|
37 |
| -class TestCustomBusinessDay(Base): |
| 24 | +class TestCustomBusinessDay(TestBusinessDay): |
38 | 25 | _offset = CDay
|
39 | 26 |
|
40 |
| - def setup_method(self, method): |
41 |
| - self.d = datetime(2008, 1, 1) |
42 |
| - self.nd = np_datetime64_compat("2008-01-01 00:00:00Z") |
43 |
| - |
44 |
| - self.offset = CDay() |
45 |
| - self.offset1 = self.offset |
46 |
| - self.offset2 = CDay(2) |
47 |
| - |
48 |
| - def test_different_normalize_equals(self): |
49 |
| - # GH#21404 changed __eq__ to return False when `normalize` does not match |
50 |
| - offset = self._offset() |
51 |
| - offset2 = self._offset(normalize=True) |
52 |
| - assert offset != offset2 |
53 |
| - |
54 | 27 | def test_repr(self):
|
55 | 28 | assert repr(self.offset) == "<CustomBusinessDay>"
|
56 | 29 | assert repr(self.offset2) == "<2 * CustomBusinessDays>"
|
57 | 30 |
|
58 | 31 | expected = "<BusinessDay: offset=datetime.timedelta(days=1)>"
|
59 | 32 | assert repr(self.offset + timedelta(1)) == expected
|
60 | 33 |
|
61 |
| - def test_with_offset(self): |
62 |
| - offset = self.offset + timedelta(hours=2) |
63 |
| - |
64 |
| - assert (self.d + offset) == datetime(2008, 1, 2, 2) |
65 |
| - |
66 |
| - @pytest.mark.parametrize("reverse", [True, False]) |
67 |
| - @pytest.mark.parametrize( |
68 |
| - "td", |
69 |
| - [ |
70 |
| - Timedelta(hours=2), |
71 |
| - Timedelta(hours=2).to_pytimedelta(), |
72 |
| - Timedelta(hours=2).to_timedelta64(), |
73 |
| - ], |
74 |
| - ids=lambda x: type(x), |
75 |
| - ) |
76 |
| - def test_with_offset_index(self, reverse, td, request): |
77 |
| - if reverse and isinstance(td, np.timedelta64): |
78 |
| - mark = pytest.mark.xfail( |
79 |
| - reason="need __array_priority__, but that causes other errors" |
80 |
| - ) |
81 |
| - request.node.add_marker(mark) |
82 |
| - |
83 |
| - dti = DatetimeIndex([self.d]) |
84 |
| - expected = DatetimeIndex([datetime(2008, 1, 2, 2)]) |
85 |
| - |
86 |
| - if reverse: |
87 |
| - result = dti + (td + self.offset) |
88 |
| - else: |
89 |
| - result = dti + (self.offset + td) |
90 |
| - tm.assert_index_equal(result, expected) |
91 |
| - |
92 |
| - def test_eq(self): |
93 |
| - assert self.offset2 == self.offset2 |
94 |
| - |
95 |
| - def test_mul(self): |
96 |
| - pass |
97 |
| - |
98 |
| - def test_hash(self): |
99 |
| - assert hash(self.offset2) == hash(self.offset2) |
100 |
| - |
101 |
| - def test_call(self): |
102 |
| - with tm.assert_produces_warning(FutureWarning): |
103 |
| - # GH#34171 DateOffset.__call__ is deprecated |
104 |
| - assert self.offset2(self.d) == datetime(2008, 1, 3) |
105 |
| - assert self.offset2(self.nd) == datetime(2008, 1, 3) |
106 |
| - |
107 |
| - def testRollback1(self): |
108 |
| - assert CDay(10).rollback(self.d) == self.d |
109 |
| - |
110 |
| - def testRollback2(self): |
111 |
| - assert CDay(10).rollback(datetime(2008, 1, 5)) == datetime(2008, 1, 4) |
112 |
| - |
113 |
| - def testRollforward1(self): |
114 |
| - assert CDay(10).rollforward(self.d) == self.d |
115 |
| - |
116 |
| - def testRollforward2(self): |
117 |
| - assert CDay(10).rollforward(datetime(2008, 1, 5)) == datetime(2008, 1, 7) |
118 |
| - |
119 |
| - def test_roll_date_object(self): |
120 |
| - offset = CDay() |
121 |
| - |
122 |
| - dt = date(2012, 9, 15) |
123 |
| - |
124 |
| - result = offset.rollback(dt) |
125 |
| - assert result == datetime(2012, 9, 14) |
126 |
| - |
127 |
| - result = offset.rollforward(dt) |
128 |
| - assert result == datetime(2012, 9, 17) |
129 |
| - |
130 |
| - offset = offsets.Day() |
131 |
| - result = offset.rollback(dt) |
132 |
| - assert result == datetime(2012, 9, 15) |
133 |
| - |
134 |
| - result = offset.rollforward(dt) |
135 |
| - assert result == datetime(2012, 9, 15) |
136 |
| - |
137 |
| - on_offset_cases = [ |
138 |
| - (CDay(), datetime(2008, 1, 1), True), |
139 |
| - (CDay(), datetime(2008, 1, 5), False), |
140 |
| - ] |
141 |
| - |
142 |
| - @pytest.mark.parametrize("case", on_offset_cases) |
143 |
| - def test_is_on_offset(self, case): |
144 |
| - offset, day, expected = case |
145 |
| - assert_is_on_offset(offset, day, expected) |
146 |
| - |
147 |
| - apply_cases: _ApplyCases = [ |
148 |
| - ( |
149 |
| - CDay(), |
150 |
| - { |
151 |
| - datetime(2008, 1, 1): datetime(2008, 1, 2), |
152 |
| - datetime(2008, 1, 4): datetime(2008, 1, 7), |
153 |
| - datetime(2008, 1, 5): datetime(2008, 1, 7), |
154 |
| - datetime(2008, 1, 6): datetime(2008, 1, 7), |
155 |
| - datetime(2008, 1, 7): datetime(2008, 1, 8), |
156 |
| - }, |
157 |
| - ), |
158 |
| - ( |
159 |
| - 2 * CDay(), |
160 |
| - { |
161 |
| - datetime(2008, 1, 1): datetime(2008, 1, 3), |
162 |
| - datetime(2008, 1, 4): datetime(2008, 1, 8), |
163 |
| - datetime(2008, 1, 5): datetime(2008, 1, 8), |
164 |
| - datetime(2008, 1, 6): datetime(2008, 1, 8), |
165 |
| - datetime(2008, 1, 7): datetime(2008, 1, 9), |
166 |
| - }, |
167 |
| - ), |
168 |
| - ( |
169 |
| - -CDay(), |
170 |
| - { |
171 |
| - datetime(2008, 1, 1): datetime(2007, 12, 31), |
172 |
| - datetime(2008, 1, 4): datetime(2008, 1, 3), |
173 |
| - datetime(2008, 1, 5): datetime(2008, 1, 4), |
174 |
| - datetime(2008, 1, 6): datetime(2008, 1, 4), |
175 |
| - datetime(2008, 1, 7): datetime(2008, 1, 4), |
176 |
| - datetime(2008, 1, 8): datetime(2008, 1, 7), |
177 |
| - }, |
178 |
| - ), |
179 |
| - ( |
180 |
| - -2 * CDay(), |
181 |
| - { |
182 |
| - datetime(2008, 1, 1): datetime(2007, 12, 28), |
183 |
| - datetime(2008, 1, 4): datetime(2008, 1, 2), |
184 |
| - datetime(2008, 1, 5): datetime(2008, 1, 3), |
185 |
| - datetime(2008, 1, 6): datetime(2008, 1, 3), |
186 |
| - datetime(2008, 1, 7): datetime(2008, 1, 3), |
187 |
| - datetime(2008, 1, 8): datetime(2008, 1, 4), |
188 |
| - datetime(2008, 1, 9): datetime(2008, 1, 7), |
189 |
| - }, |
190 |
| - ), |
191 |
| - ( |
192 |
| - CDay(0), |
193 |
| - { |
194 |
| - datetime(2008, 1, 1): datetime(2008, 1, 1), |
195 |
| - datetime(2008, 1, 4): datetime(2008, 1, 4), |
196 |
| - datetime(2008, 1, 5): datetime(2008, 1, 7), |
197 |
| - datetime(2008, 1, 6): datetime(2008, 1, 7), |
198 |
| - datetime(2008, 1, 7): datetime(2008, 1, 7), |
199 |
| - }, |
200 |
| - ), |
201 |
| - ] |
202 |
| - |
203 |
| - @pytest.mark.parametrize("case", apply_cases) |
204 |
| - def test_apply(self, case): |
205 |
| - offset, cases = case |
206 |
| - for base, expected in cases.items(): |
207 |
| - assert_offset_equal(offset, base, expected) |
208 |
| - |
209 |
| - def test_apply_large_n(self): |
210 |
| - dt = datetime(2012, 10, 23) |
211 |
| - |
212 |
| - result = dt + CDay(10) |
213 |
| - assert result == datetime(2012, 11, 6) |
214 |
| - |
215 |
| - result = dt + CDay(100) - CDay(100) |
216 |
| - assert result == dt |
217 |
| - |
218 |
| - off = CDay() * 6 |
219 |
| - rs = datetime(2012, 1, 1) - off |
220 |
| - xp = datetime(2011, 12, 23) |
221 |
| - assert rs == xp |
222 |
| - |
223 |
| - st = datetime(2011, 12, 18) |
224 |
| - rs = st + off |
225 |
| - xp = datetime(2011, 12, 26) |
226 |
| - assert rs == xp |
227 |
| - |
228 |
| - def test_apply_corner(self): |
229 |
| - msg = ( |
230 |
| - "Only know how to combine trading day " |
231 |
| - "with datetime, datetime64 or timedelta" |
232 |
| - ) |
233 |
| - with pytest.raises(ApplyTypeError, match=msg): |
234 |
| - CDay().apply(BMonthEnd()) |
235 |
| - |
236 | 34 | def test_holidays(self):
|
237 | 35 | # Define a TradingDay offset
|
238 | 36 | holidays = ["2012-05-01", datetime(2013, 5, 1), np.datetime64("2014-05-01")]
|
|
0 commit comments