Skip to content

Commit 0ba25af

Browse files
author
Si Wei How
committed
Add test cases for BusinessHours with multiple opening hours
1 parent 913eee2 commit 0ba25af

File tree

1 file changed

+233
-2
lines changed

1 file changed

+233
-2
lines changed

pandas/tests/tseries/offsets/test_offsets.py

Lines changed: 233 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,9 @@ def setup_method(self, method):
760760
self.offset6 = BusinessHour(start='20:00', end='05:00')
761761
self.offset7 = BusinessHour(n=-2, start=dt_time(21, 30),
762762
end=dt_time(6, 30))
763+
self.offset8 = BusinessHour(start=['09:00', '13:00'], end=['12:00', '17:00'])
764+
self.offset9 = BusinessHour(n=3, start=['09:00', '22:00'], end=['13:00', '03:00'])
765+
self.offset10 = BusinessHour(n=-1, start=['23:00', '13:00'], end=['02:00', '17:00'])
763766

764767
def test_constructor_errors(self):
765768
from datetime import time as dt_time
@@ -769,6 +772,14 @@ def test_constructor_errors(self):
769772
BusinessHour(start='AAA')
770773
with pytest.raises(ValueError):
771774
BusinessHour(start='14:00:05')
775+
with pytest.raises(ValueError):
776+
BusinessHour(start=[])
777+
with pytest.raises(ValueError):
778+
BusinessHour(start=['09:00', '11:00'])
779+
with pytest.raises(ValueError):
780+
BusinessHour(start=['09:00', '11:00'], end=['10:00'])
781+
with pytest.raises(ValueError):
782+
BusinessHour(start=['09:00', '11:00'], end=['12:00', '20:00'])
772783

773784
def test_different_normalize_equals(self):
774785
# GH#21404 changed __eq__ to return False when `normalize` doesnt match
@@ -785,6 +796,9 @@ def test_repr(self):
785796
assert repr(self.offset5) == '<BusinessHour: BH=11:00-14:30>'
786797
assert repr(self.offset6) == '<BusinessHour: BH=20:00-05:00>'
787798
assert repr(self.offset7) == '<-2 * BusinessHours: BH=21:30-06:30>'
799+
assert repr(self.offset8) == '<BusinessHour: BH=09:00,13:00-12:00,17:00>'
800+
assert repr(self.offset9) == '<3 * BusinessHours: BH=09:00,22:00-13:00,03:00>'
801+
assert repr(self.offset10) == '<-1 * BusinessHour: BH=13:00,23:00-17:00,02:00>'
788802

789803
def test_with_offset(self):
790804
expected = Timestamp('2014-07-01 13:00')
@@ -793,7 +807,8 @@ def test_with_offset(self):
793807
assert self.d + BusinessHour(n=3) == expected
794808

795809
def test_eq(self):
796-
for offset in [self.offset1, self.offset2, self.offset3, self.offset4]:
810+
for offset in [self.offset1, self.offset2, self.offset3, self.offset4,
811+
self.offset8, self.offset9, self.offset10]:
797812
assert offset == offset
798813

799814
assert BusinessHour() != BusinessHour(-1)
@@ -802,15 +817,24 @@ def test_eq(self):
802817
assert (BusinessHour(start='09:00', end='17:00') !=
803818
BusinessHour(start='17:00', end='09:01'))
804819

820+
assert (BusinessHour(start=['23:00', '13:00'], end=['12:00', '17:00']) ==
821+
BusinessHour(start=['13:00', '23:00'], end=['17:00', '12:00']))
822+
assert (BusinessHour(start=['13:00', '23:00'], end=['18:00', '07:00']) !=
823+
BusinessHour(start=['13:00', '23:00'], end=['17:00', '12:00']))
824+
805825
def test_hash(self):
806-
for offset in [self.offset1, self.offset2, self.offset3, self.offset4]:
826+
for offset in [self.offset1, self.offset2, self.offset3, self.offset4,
827+
self.offset8, self.offset9, self.offset10]:
807828
assert hash(offset) == hash(offset)
808829

809830
def test_call(self):
810831
assert self.offset1(self.d) == datetime(2014, 7, 1, 11)
811832
assert self.offset2(self.d) == datetime(2014, 7, 1, 13)
812833
assert self.offset3(self.d) == datetime(2014, 6, 30, 17)
813834
assert self.offset4(self.d) == datetime(2014, 6, 30, 14)
835+
assert self.offset8(self.d) == datetime(2014, 7, 1, 11)
836+
assert self.offset9(self.d) == datetime(2014, 7, 1, 22)
837+
assert self.offset10(self.d) == datetime(2014, 7, 1, 1)
814838

815839
def test_sub(self):
816840
# we have to override test_sub here becasue self.offset2 is not
@@ -831,6 +855,9 @@ def testRollback1(self):
831855
assert self.offset5.rollback(self.d) == datetime(2014, 6, 30, 14, 30)
832856
assert self.offset6.rollback(self.d) == datetime(2014, 7, 1, 5, 0)
833857
assert self.offset7.rollback(self.d) == datetime(2014, 7, 1, 6, 30)
858+
assert self.offset8.rollback(self.d) == self.d
859+
assert self.offset9.rollback(self.d) == self.d
860+
assert self.offset10.rollback(self.d) == datetime(2014, 7, 1, 2)
834861

835862
d = datetime(2014, 7, 1, 0)
836863
assert self.offset1.rollback(d) == datetime(2014, 6, 30, 17)
@@ -840,6 +867,9 @@ def testRollback1(self):
840867
assert self.offset5.rollback(d) == datetime(2014, 6, 30, 14, 30)
841868
assert self.offset6.rollback(d) == d
842869
assert self.offset7.rollback(d) == d
870+
assert self.offset8.rollback(d) == datetime(2014, 6, 30, 17)
871+
assert self.offset9.rollback(d) == d
872+
assert self.offset10.rollback(d) == d
843873

844874
assert self._offset(5).rollback(self.d) == self.d
845875

@@ -858,6 +888,9 @@ def testRollforward1(self):
858888
datetime(2014, 7, 1, 20, 0))
859889
assert (self.offset7.rollforward(self.d) ==
860890
datetime(2014, 7, 1, 21, 30))
891+
assert self.offset8.rollforward(self.d) == self.d
892+
assert self.offset9.rollforward(self.d) == self.d
893+
assert self.offset10.rollforward(self.d) == datetime(2014, 7, 1, 13)
861894

862895
d = datetime(2014, 7, 1, 0)
863896
assert self.offset1.rollforward(d) == datetime(2014, 7, 1, 9)
@@ -867,6 +900,9 @@ def testRollforward1(self):
867900
assert self.offset5.rollforward(d) == datetime(2014, 7, 1, 11)
868901
assert self.offset6.rollforward(d) == d
869902
assert self.offset7.rollforward(d) == d
903+
assert self.offset8.rollforward(d) == datetime(2014, 7, 1, 9)
904+
assert self.offset9.rollforward(d) == d
905+
assert self.offset10.rollforward(d) == d
870906

871907
assert self._offset(5).rollforward(self.d) == self.d
872908

@@ -961,6 +997,33 @@ def test_normalize(self, case):
961997
datetime(2014, 7, 6, 23, 0): False,
962998
datetime(2014, 7, 7, 3, 0): False}))
963999

1000+
on_offset_cases.append((BusinessHour(start=['09:00', '13:00'], end=['12:00', '17:00']), {
1001+
datetime(2014, 7, 1, 9): True,
1002+
datetime(2014, 7, 1, 8, 59): False,
1003+
datetime(2014, 7, 1, 8): False,
1004+
datetime(2014, 7, 1, 17): True,
1005+
datetime(2014, 7, 1, 17, 1): False,
1006+
datetime(2014, 7, 1, 18): False,
1007+
datetime(2014, 7, 5, 9): False,
1008+
datetime(2014, 7, 6, 12): False,
1009+
datetime(2014, 7, 1, 12, 30): False}))
1010+
1011+
on_offset_cases.append((BusinessHour(start=['19:00', '23:00'], end=['21:00', '05:00']), {
1012+
datetime(2014, 7, 1, 9, 0): False,
1013+
datetime(2014, 7, 1, 10, 0): False,
1014+
datetime(2014, 7, 1, 15): False,
1015+
datetime(2014, 7, 1, 15, 1): False,
1016+
datetime(2014, 7, 5, 12, 0): False,
1017+
datetime(2014, 7, 6, 12, 0): False,
1018+
datetime(2014, 7, 1, 19, 0): True,
1019+
datetime(2014, 7, 2, 0, 0): True,
1020+
datetime(2014, 7, 4, 23): True,
1021+
datetime(2014, 7, 5, 1): True,
1022+
datetime(2014, 7, 5, 5, 0): True,
1023+
datetime(2014, 7, 6, 23, 0): False,
1024+
datetime(2014, 7, 7, 3, 0): False,
1025+
datetime(2014, 7, 4, 22): False}))
1026+
9641027
@pytest.mark.parametrize('case', on_offset_cases)
9651028
def test_onOffset(self, case):
9661029
offset, cases = case
@@ -1126,6 +1189,69 @@ def test_onOffset(self, case):
11261189
datetime(2014, 7, 7, 18): (datetime(2014, 7, 7, 17),
11271190
datetime(2014, 7, 8, 17))}))
11281191

1192+
opening_time_cases.append(([BusinessHour(start=['11:15', '15:00'], end=['13:00', '20:00']),
1193+
BusinessHour(n=3, start=['11:15', '15:00'], end=['12:00', '20:00']),
1194+
BusinessHour(start=['11:15', '15:00'], end=['13:00', '17:00']),
1195+
BusinessHour(n=2, start=['11:15', '15:00'], end=['12:00', '03:00']),
1196+
BusinessHour(n=3, start=['11:15', '15:00'], end=['13:00', '16:00'])], {
1197+
datetime(2014, 7, 1, 11): (datetime(2014, 7, 1, 11, 15),
1198+
datetime(2014, 6, 30, 15)),
1199+
datetime(2014, 7, 1, 18): (datetime(2014, 7, 2, 11, 15),
1200+
datetime(2014, 7, 1, 15)),
1201+
datetime(2014, 7, 1, 23): (datetime(2014, 7, 2, 11, 15),
1202+
datetime(2014, 7, 1, 15)),
1203+
datetime(2014, 7, 2, 8): (datetime(2014, 7, 2, 11, 15),
1204+
datetime(2014, 7, 1, 15)),
1205+
datetime(2014, 7, 2, 9): (datetime(2014, 7, 2, 11, 15),
1206+
datetime(2014, 7, 1, 15)),
1207+
datetime(2014, 7, 2, 10): (datetime(2014, 7, 2, 11, 15),
1208+
datetime(2014, 7, 1, 15)),
1209+
datetime(2014, 7, 2, 11, 15): (datetime(2014, 7, 2, 11, 15),
1210+
datetime(2014, 7, 2, 11, 15)),
1211+
datetime(2014, 7, 2, 11, 15, 1): (datetime(2014, 7, 2, 15),
1212+
datetime(2014, 7, 2, 11, 15)),
1213+
datetime(2014, 7, 5, 10): (datetime(2014, 7, 7, 11, 15),
1214+
datetime(2014, 7, 4, 15)),
1215+
datetime(2014, 7, 4, 10): (datetime(2014, 7, 4, 11, 15),
1216+
datetime(2014, 7, 3, 15)),
1217+
datetime(2014, 7, 4, 23): (datetime(2014, 7, 7, 11, 15),
1218+
datetime(2014, 7, 4, 15)),
1219+
datetime(2014, 7, 6, 10): (datetime(2014, 7, 7, 11, 15),
1220+
datetime(2014, 7, 4, 15)),
1221+
datetime(2014, 7, 7, 5): (datetime(2014, 7, 7, 11, 15),
1222+
datetime(2014, 7, 4, 15)),
1223+
datetime(2014, 7, 7, 9, 1): (datetime(2014, 7, 7, 11, 15),
1224+
datetime(2014, 7, 4, 15)),
1225+
datetime(2014, 7, 7, 12): (datetime(2014, 7, 7, 15),
1226+
datetime(2014, 7, 7, 11, 15))}))
1227+
1228+
opening_time_cases.append(([BusinessHour(-1, start=['17:00', '08:00'], end=['05:00', '10:00']),
1229+
BusinessHour(n=-2, start=['08:00', '17:00'], end=['10:00', '03:00'])], {
1230+
datetime(2014, 7, 1, 11): (datetime(2014, 7, 1, 8),
1231+
datetime(2014, 7, 1, 17)),
1232+
datetime(2014, 7, 1, 18): (datetime(2014, 7, 1, 17),
1233+
datetime(2014, 7, 2, 8)),
1234+
datetime(2014, 7, 1, 23): (datetime(2014, 7, 1, 17),
1235+
datetime(2014, 7, 2, 8)),
1236+
datetime(2014, 7, 2, 8): (datetime(2014, 7, 2, 8),
1237+
datetime(2014, 7, 2, 8)),
1238+
datetime(2014, 7, 2, 9): (datetime(2014, 7, 2, 8),
1239+
datetime(2014, 7, 2, 17)),
1240+
datetime(2014, 7, 2, 16, 59): (datetime(2014, 7, 2, 8),
1241+
datetime(2014, 7, 2, 17)),
1242+
datetime(2014, 7, 5, 10): (datetime(2014, 7, 4, 17),
1243+
datetime(2014, 7, 7, 8)),
1244+
datetime(2014, 7, 4, 10): (datetime(2014, 7, 4, 8),
1245+
datetime(2014, 7, 4, 17)),
1246+
datetime(2014, 7, 4, 23): (datetime(2014, 7, 4, 17),
1247+
datetime(2014, 7, 7, 8)),
1248+
datetime(2014, 7, 6, 10): (datetime(2014, 7, 4, 17),
1249+
datetime(2014, 7, 7, 8)),
1250+
datetime(2014, 7, 7, 5): (datetime(2014, 7, 4, 17),
1251+
datetime(2014, 7, 7, 8)),
1252+
datetime(2014, 7, 7, 18): (datetime(2014, 7, 7, 17),
1253+
datetime(2014, 7, 8, 8))}))
1254+
11291255
@pytest.mark.parametrize('case', opening_time_cases)
11301256
def test_opening_time(self, case):
11311257
_offsets, cases = case
@@ -1287,6 +1413,77 @@ def test_opening_time(self, case):
12871413
datetime(2014, 7, 7, 19, 30): datetime(2014, 7, 5, 4, 30),
12881414
datetime(2014, 7, 7, 19, 30, 30): datetime(2014, 7, 5, 4, 30, 30)}))
12891415

1416+
# multiple business hours
1417+
apply_cases.append((BusinessHour(start=['09:00', '14:00'], end=['12:00', '18:00']), {
1418+
datetime(2014, 7, 1, 11): datetime(2014, 7, 1, 14),
1419+
datetime(2014, 7, 1, 15): datetime(2014, 7, 1, 16),
1420+
datetime(2014, 7, 1, 19): datetime(2014, 7, 2, 10),
1421+
datetime(2014, 7, 1, 16): datetime(2014, 7, 1, 17),
1422+
datetime(2014, 7, 1, 16, 30, 15): datetime(2014, 7, 1, 17, 30, 15),
1423+
datetime(2014, 7, 1, 17): datetime(2014, 7, 2, 9),
1424+
datetime(2014, 7, 2, 11): datetime(2014, 7, 2, 14),
1425+
# out of business hours
1426+
datetime(2014, 7, 1, 13): datetime(2014, 7, 1, 15),
1427+
datetime(2014, 7, 2, 8): datetime(2014, 7, 2, 10),
1428+
datetime(2014, 7, 2, 19): datetime(2014, 7, 3, 10),
1429+
datetime(2014, 7, 2, 23): datetime(2014, 7, 3, 10),
1430+
datetime(2014, 7, 3, 0): datetime(2014, 7, 3, 10),
1431+
# saturday
1432+
datetime(2014, 7, 5, 15): datetime(2014, 7, 7, 10),
1433+
datetime(2014, 7, 4, 17): datetime(2014, 7, 7, 9),
1434+
datetime(2014, 7, 4, 17, 30): datetime(2014, 7, 7, 9, 30),
1435+
datetime(2014, 7, 4, 17, 30, 30): datetime(2014, 7, 7, 9, 30, 30)}))
1436+
1437+
apply_cases.append((BusinessHour(n=4, start=['09:00', '14:00'], end=['12:00', '18:00']), {
1438+
datetime(2014, 7, 1, 11): datetime(2014, 7, 1, 17),
1439+
datetime(2014, 7, 1, 13): datetime(2014, 7, 2, 9),
1440+
datetime(2014, 7, 1, 15): datetime(2014, 7, 2, 10),
1441+
datetime(2014, 7, 1, 16): datetime(2014, 7, 2, 11),
1442+
datetime(2014, 7, 1, 17): datetime(2014, 7, 2, 14),
1443+
datetime(2014, 7, 2, 11): datetime(2014, 7, 2, 17),
1444+
datetime(2014, 7, 2, 8): datetime(2014, 7, 2, 15),
1445+
datetime(2014, 7, 2, 19): datetime(2014, 7, 3, 15),
1446+
datetime(2014, 7, 2, 23): datetime(2014, 7, 3, 15),
1447+
datetime(2014, 7, 3, 0): datetime(2014, 7, 3, 15),
1448+
datetime(2014, 7, 5, 15): datetime(2014, 7, 7, 15),
1449+
datetime(2014, 7, 4, 17): datetime(2014, 7, 7, 14),
1450+
datetime(2014, 7, 4, 16, 30): datetime(2014, 7, 7, 11, 30),
1451+
datetime(2014, 7, 4, 16, 30, 30): datetime(2014, 7, 7, 11, 30, 30)}))
1452+
1453+
apply_cases.append((BusinessHour(n=-4, start=['09:00', '14:00'], end=['12:00', '18:00']), {
1454+
datetime(2014, 7, 1, 11): datetime(2014, 6, 30, 16),
1455+
datetime(2014, 7, 1, 13): datetime(2014, 6, 30, 17),
1456+
datetime(2014, 7, 1, 15): datetime(2014, 6, 30, 18),
1457+
datetime(2014, 7, 1, 16): datetime(2014, 7, 1, 10),
1458+
datetime(2014, 7, 1, 17): datetime(2014, 7, 1, 11),
1459+
datetime(2014, 7, 2, 11): datetime(2014, 7, 1, 16),
1460+
datetime(2014, 7, 2, 8): datetime(2014, 7, 1, 12),
1461+
datetime(2014, 7, 2, 19): datetime(2014, 7, 2, 12),
1462+
datetime(2014, 7, 2, 23): datetime(2014, 7, 2, 12),
1463+
datetime(2014, 7, 3, 0): datetime(2014, 7, 2, 12),
1464+
datetime(2014, 7, 5, 15): datetime(2014, 7, 4, 12),
1465+
datetime(2014, 7, 4, 18): datetime(2014, 7, 4, 12),
1466+
datetime(2014, 7, 7, 9, 30): datetime(2014, 7, 4, 14, 30),
1467+
datetime(2014, 7, 7, 9, 30, 30): datetime(2014, 7, 4, 14, 30, 30)}))
1468+
1469+
apply_cases.append((BusinessHour(n=-1, start=['19:00', '03:00'], end=['01:00', '05:00']), {
1470+
datetime(2014, 7, 1, 17): datetime(2014, 7, 1, 4),
1471+
datetime(2014, 7, 2, 14): datetime(2014, 7, 2, 4),
1472+
datetime(2014, 7, 2, 8): datetime(2014, 7, 2, 4),
1473+
datetime(2014, 7, 2, 13): datetime(2014, 7, 2, 4),
1474+
datetime(2014, 7, 2, 20): datetime(2014, 7, 2, 5),
1475+
datetime(2014, 7, 2, 19): datetime(2014, 7, 2, 4),
1476+
datetime(2014, 7, 2, 4): datetime(2014, 7, 2, 1),
1477+
datetime(2014, 7, 2, 19, 30): datetime(2014, 7, 2, 4, 30),
1478+
datetime(2014, 7, 3, 0): datetime(2014, 7, 2, 23),
1479+
datetime(2014, 7, 3, 6): datetime(2014, 7, 3, 4),
1480+
datetime(2014, 7, 4, 23): datetime(2014, 7, 4, 22),
1481+
datetime(2014, 7, 5, 0): datetime(2014, 7, 4, 23),
1482+
datetime(2014, 7, 5, 4): datetime(2014, 7, 5, 0),
1483+
datetime(2014, 7, 7, 3, 30): datetime(2014, 7, 5, 0, 30),
1484+
datetime(2014, 7, 7, 19, 30): datetime(2014, 7, 7, 4, 30),
1485+
datetime(2014, 7, 7, 19, 30, 30): datetime(2014, 7, 7, 4, 30, 30)}))
1486+
12901487
@pytest.mark.parametrize('case', apply_cases)
12911488
def test_apply(self, case):
12921489
offset, cases = case
@@ -1343,6 +1540,40 @@ def test_apply(self, case):
13431540
datetime(2014, 7, 7, 1): datetime(2014, 7, 15, 0),
13441541
datetime(2014, 7, 7, 23, 30): datetime(2014, 7, 15, 21, 30)}))
13451542

1543+
# large n for multiple opening hours (3 days and 1 hour before)
1544+
apply_large_n_cases.append((BusinessHour(n=-25, start=['09:00', '14:00'], end=['12:00', '19:00']), {
1545+
datetime(2014, 7, 1, 11): datetime(2014, 6, 26, 10),
1546+
datetime(2014, 7, 1, 13): datetime(2014, 6, 26, 11),
1547+
datetime(2014, 7, 1, 9): datetime(2014, 6, 25, 18),
1548+
datetime(2014, 7, 1, 10): datetime(2014, 6, 25, 19),
1549+
datetime(2014, 7, 3, 11): datetime(2014, 6, 30, 10),
1550+
datetime(2014, 7, 3, 8): datetime(2014, 6, 27, 18),
1551+
datetime(2014, 7, 3, 19): datetime(2014, 6, 30, 18),
1552+
datetime(2014, 7, 3, 23): datetime(2014, 6, 30, 18),
1553+
datetime(2014, 7, 4, 9): datetime(2014, 6, 30, 18),
1554+
datetime(2014, 7, 5, 15): datetime(2014, 7, 1, 18),
1555+
datetime(2014, 7, 6, 18): datetime(2014, 7, 1, 18),
1556+
datetime(2014, 7, 7, 9, 30): datetime(2014, 7, 1, 18, 30),
1557+
datetime(2014, 7, 7, 10, 30, 30): datetime(2014, 7, 2, 9, 30, 30)}))
1558+
1559+
# 5 days and 3 hours later
1560+
apply_large_n_cases.append((BusinessHour(28, start=['21:00', '03:00'], end=['01:00', '04:00']), {
1561+
datetime(2014, 7, 1, 11): datetime(2014, 7, 9, 0),
1562+
datetime(2014, 7, 1, 22): datetime(2014, 7, 9, 3),
1563+
datetime(2014, 7, 1, 23): datetime(2014, 7, 9, 21),
1564+
datetime(2014, 7, 2, 2): datetime(2014, 7, 9, 23),
1565+
datetime(2014, 7, 3, 21): datetime(2014, 7, 11, 0),
1566+
datetime(2014, 7, 4, 1): datetime(2014, 7, 11, 23),
1567+
datetime(2014, 7, 4, 2): datetime(2014, 7, 11, 23),
1568+
datetime(2014, 7, 4, 3): datetime(2014, 7, 11, 23),
1569+
datetime(2014, 7, 4, 21): datetime(2014, 7, 12, 0),
1570+
datetime(2014, 7, 5, 0): datetime(2014, 7, 14, 22),
1571+
datetime(2014, 7, 5, 1): datetime(2014, 7, 14, 23),
1572+
datetime(2014, 7, 5, 15): datetime(2014, 7, 14, 23),
1573+
datetime(2014, 7, 6, 18): datetime(2014, 7, 14, 23),
1574+
datetime(2014, 7, 7, 1): datetime(2014, 7, 14, 23),
1575+
datetime(2014, 7, 7, 23, 30): datetime(2014, 7, 15, 21, 30)}))
1576+
13461577
@pytest.mark.parametrize('case', apply_large_n_cases)
13471578
def test_apply_large_n(self, case):
13481579
offset, cases = case

0 commit comments

Comments
 (0)