12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463 |
- """
- Tests for offsets.BusinessHour
- """
- from __future__ import annotations
- from datetime import (
- datetime,
- time as dt_time,
- )
- import pytest
- from pandas._libs.tslibs import (
- Timedelta,
- Timestamp,
- )
- from pandas._libs.tslibs.offsets import (
- BDay,
- BusinessHour,
- Nano,
- )
- from pandas import (
- DatetimeIndex,
- _testing as tm,
- date_range,
- )
- from pandas.tests.tseries.offsets.common import assert_offset_equal
- @pytest.fixture
- def dt():
- return datetime(2014, 7, 1, 10, 00)
- @pytest.fixture
- def _offset():
- return BusinessHour
- @pytest.fixture
- def offset1():
- return BusinessHour()
- @pytest.fixture
- def offset2():
- return BusinessHour(n=3)
- @pytest.fixture
- def offset3():
- return BusinessHour(n=-1)
- @pytest.fixture
- def offset4():
- return BusinessHour(n=-4)
- @pytest.fixture
- def offset5():
- return BusinessHour(start=dt_time(11, 0), end=dt_time(14, 30))
- @pytest.fixture
- def offset6():
- return BusinessHour(start="20:00", end="05:00")
- @pytest.fixture
- def offset7():
- return BusinessHour(n=-2, start=dt_time(21, 30), end=dt_time(6, 30))
- @pytest.fixture
- def offset8():
- return BusinessHour(start=["09:00", "13:00"], end=["12:00", "17:00"])
- @pytest.fixture
- def offset9():
- return BusinessHour(n=3, start=["09:00", "22:00"], end=["13:00", "03:00"])
- @pytest.fixture
- def offset10():
- return BusinessHour(n=-1, start=["23:00", "13:00"], end=["02:00", "17:00"])
- class TestBusinessHour:
- @pytest.mark.parametrize(
- "start,end,match",
- [
- (
- dt_time(11, 0, 5),
- "17:00",
- "time data must be specified only with hour and minute",
- ),
- ("AAA", "17:00", "time data must match '%H:%M' format"),
- ("14:00:05", "17:00", "time data must match '%H:%M' format"),
- ([], "17:00", "Must include at least 1 start time"),
- ("09:00", [], "Must include at least 1 end time"),
- (
- ["09:00", "11:00"],
- "17:00",
- "number of starting time and ending time must be the same",
- ),
- (
- ["09:00", "11:00"],
- ["10:00"],
- "number of starting time and ending time must be the same",
- ),
- (
- ["09:00", "11:00"],
- ["12:00", "20:00"],
- r"invalid starting and ending time\(s\): opening hours should not "
- "touch or overlap with one another",
- ),
- (
- ["12:00", "20:00"],
- ["09:00", "11:00"],
- r"invalid starting and ending time\(s\): opening hours should not "
- "touch or overlap with one another",
- ),
- ],
- )
- def test_constructor_errors(self, start, end, match):
- with pytest.raises(ValueError, match=match):
- BusinessHour(start=start, end=end)
- def test_different_normalize_equals(self, _offset):
- # GH#21404 changed __eq__ to return False when `normalize` does not match
- offset = _offset()
- offset2 = _offset(normalize=True)
- assert offset != offset2
- def test_repr(
- self,
- offset1,
- offset2,
- offset3,
- offset4,
- offset5,
- offset6,
- offset7,
- offset8,
- offset9,
- offset10,
- ):
- assert repr(offset1) == "<BusinessHour: BH=09:00-17:00>"
- assert repr(offset2) == "<3 * BusinessHours: BH=09:00-17:00>"
- assert repr(offset3) == "<-1 * BusinessHour: BH=09:00-17:00>"
- assert repr(offset4) == "<-4 * BusinessHours: BH=09:00-17:00>"
- assert repr(offset5) == "<BusinessHour: BH=11:00-14:30>"
- assert repr(offset6) == "<BusinessHour: BH=20:00-05:00>"
- assert repr(offset7) == "<-2 * BusinessHours: BH=21:30-06:30>"
- assert repr(offset8) == "<BusinessHour: BH=09:00-12:00,13:00-17:00>"
- assert repr(offset9) == "<3 * BusinessHours: BH=09:00-13:00,22:00-03:00>"
- assert repr(offset10) == "<-1 * BusinessHour: BH=13:00-17:00,23:00-02:00>"
- def test_with_offset(self, dt):
- expected = Timestamp("2014-07-01 13:00")
- assert dt + BusinessHour() * 3 == expected
- assert dt + BusinessHour(n=3) == expected
- @pytest.mark.parametrize(
- "offset_name",
- ["offset1", "offset2", "offset3", "offset4", "offset8", "offset9", "offset10"],
- )
- def test_eq_attribute(self, offset_name, request):
- offset = request.getfixturevalue(offset_name)
- assert offset == offset
- @pytest.mark.parametrize(
- "offset1,offset2",
- [
- (BusinessHour(start="09:00"), BusinessHour()),
- (
- BusinessHour(start=["23:00", "13:00"], end=["12:00", "17:00"]),
- BusinessHour(start=["13:00", "23:00"], end=["17:00", "12:00"]),
- ),
- ],
- )
- def test_eq(self, offset1, offset2):
- assert offset1 == offset2
- @pytest.mark.parametrize(
- "offset1,offset2",
- [
- (BusinessHour(), BusinessHour(-1)),
- (BusinessHour(start="09:00"), BusinessHour(start="09:01")),
- (
- BusinessHour(start="09:00", end="17:00"),
- BusinessHour(start="17:00", end="09:01"),
- ),
- (
- BusinessHour(start=["13:00", "23:00"], end=["18:00", "07:00"]),
- BusinessHour(start=["13:00", "23:00"], end=["17:00", "12:00"]),
- ),
- ],
- )
- def test_neq(self, offset1, offset2):
- assert offset1 != offset2
- @pytest.mark.parametrize(
- "offset_name",
- ["offset1", "offset2", "offset3", "offset4", "offset8", "offset9", "offset10"],
- )
- def test_hash(self, offset_name, request):
- offset = request.getfixturevalue(offset_name)
- assert offset == offset
- def test_add_datetime(
- self,
- dt,
- offset1,
- offset2,
- offset3,
- offset4,
- offset8,
- offset9,
- offset10,
- ):
- assert offset1 + dt == datetime(2014, 7, 1, 11)
- assert offset2 + dt == datetime(2014, 7, 1, 13)
- assert offset3 + dt == datetime(2014, 6, 30, 17)
- assert offset4 + dt == datetime(2014, 6, 30, 14)
- assert offset8 + dt == datetime(2014, 7, 1, 11)
- assert offset9 + dt == datetime(2014, 7, 1, 22)
- assert offset10 + dt == datetime(2014, 7, 1, 1)
- def test_sub(self, dt, offset2, _offset):
- off = offset2
- msg = "Cannot subtract datetime from offset"
- with pytest.raises(TypeError, match=msg):
- off - dt
- assert 2 * off - off == off
- assert dt - offset2 == dt + _offset(-3)
- def test_multiply_by_zero(self, dt, offset1, offset2):
- assert dt - 0 * offset1 == dt
- assert dt + 0 * offset1 == dt
- assert dt - 0 * offset2 == dt
- assert dt + 0 * offset2 == dt
- def testRollback1(
- self,
- dt,
- _offset,
- offset1,
- offset2,
- offset3,
- offset4,
- offset5,
- offset6,
- offset7,
- offset8,
- offset9,
- offset10,
- ):
- assert offset1.rollback(dt) == dt
- assert offset2.rollback(dt) == dt
- assert offset3.rollback(dt) == dt
- assert offset4.rollback(dt) == dt
- assert offset5.rollback(dt) == datetime(2014, 6, 30, 14, 30)
- assert offset6.rollback(dt) == datetime(2014, 7, 1, 5, 0)
- assert offset7.rollback(dt) == datetime(2014, 7, 1, 6, 30)
- assert offset8.rollback(dt) == dt
- assert offset9.rollback(dt) == dt
- assert offset10.rollback(dt) == datetime(2014, 7, 1, 2)
- datet = datetime(2014, 7, 1, 0)
- assert offset1.rollback(datet) == datetime(2014, 6, 30, 17)
- assert offset2.rollback(datet) == datetime(2014, 6, 30, 17)
- assert offset3.rollback(datet) == datetime(2014, 6, 30, 17)
- assert offset4.rollback(datet) == datetime(2014, 6, 30, 17)
- assert offset5.rollback(datet) == datetime(2014, 6, 30, 14, 30)
- assert offset6.rollback(datet) == datet
- assert offset7.rollback(datet) == datet
- assert offset8.rollback(datet) == datetime(2014, 6, 30, 17)
- assert offset9.rollback(datet) == datet
- assert offset10.rollback(datet) == datet
- assert _offset(5).rollback(dt) == dt
- def testRollback2(self, _offset):
- assert _offset(-3).rollback(datetime(2014, 7, 5, 15, 0)) == datetime(
- 2014, 7, 4, 17, 0
- )
- def testRollforward1(
- self,
- dt,
- _offset,
- offset1,
- offset2,
- offset3,
- offset4,
- offset5,
- offset6,
- offset7,
- offset8,
- offset9,
- offset10,
- ):
- assert offset1.rollforward(dt) == dt
- assert offset2.rollforward(dt) == dt
- assert offset3.rollforward(dt) == dt
- assert offset4.rollforward(dt) == dt
- assert offset5.rollforward(dt) == datetime(2014, 7, 1, 11, 0)
- assert offset6.rollforward(dt) == datetime(2014, 7, 1, 20, 0)
- assert offset7.rollforward(dt) == datetime(2014, 7, 1, 21, 30)
- assert offset8.rollforward(dt) == dt
- assert offset9.rollforward(dt) == dt
- assert offset10.rollforward(dt) == datetime(2014, 7, 1, 13)
- datet = datetime(2014, 7, 1, 0)
- assert offset1.rollforward(datet) == datetime(2014, 7, 1, 9)
- assert offset2.rollforward(datet) == datetime(2014, 7, 1, 9)
- assert offset3.rollforward(datet) == datetime(2014, 7, 1, 9)
- assert offset4.rollforward(datet) == datetime(2014, 7, 1, 9)
- assert offset5.rollforward(datet) == datetime(2014, 7, 1, 11)
- assert offset6.rollforward(datet) == datet
- assert offset7.rollforward(datet) == datet
- assert offset8.rollforward(datet) == datetime(2014, 7, 1, 9)
- assert offset9.rollforward(datet) == datet
- assert offset10.rollforward(datet) == datet
- assert _offset(5).rollforward(dt) == dt
- def testRollforward2(self, _offset):
- assert _offset(-3).rollforward(datetime(2014, 7, 5, 16, 0)) == datetime(
- 2014, 7, 7, 9
- )
- def test_roll_date_object(self):
- offset = BusinessHour()
- dt = datetime(2014, 7, 6, 15, 0)
- result = offset.rollback(dt)
- assert result == datetime(2014, 7, 4, 17)
- result = offset.rollforward(dt)
- assert result == datetime(2014, 7, 7, 9)
- normalize_cases = []
- normalize_cases.append(
- (
- BusinessHour(normalize=True),
- {
- datetime(2014, 7, 1, 8): datetime(2014, 7, 1),
- datetime(2014, 7, 1, 17): datetime(2014, 7, 2),
- datetime(2014, 7, 1, 16): datetime(2014, 7, 2),
- datetime(2014, 7, 1, 23): datetime(2014, 7, 2),
- datetime(2014, 7, 1, 0): datetime(2014, 7, 1),
- datetime(2014, 7, 4, 15): datetime(2014, 7, 4),
- datetime(2014, 7, 4, 15, 59): datetime(2014, 7, 4),
- datetime(2014, 7, 4, 16, 30): datetime(2014, 7, 7),
- datetime(2014, 7, 5, 23): datetime(2014, 7, 7),
- datetime(2014, 7, 6, 10): datetime(2014, 7, 7),
- },
- )
- )
- normalize_cases.append(
- (
- BusinessHour(-1, normalize=True),
- {
- datetime(2014, 7, 1, 8): datetime(2014, 6, 30),
- datetime(2014, 7, 1, 17): datetime(2014, 7, 1),
- datetime(2014, 7, 1, 16): datetime(2014, 7, 1),
- datetime(2014, 7, 1, 10): datetime(2014, 6, 30),
- datetime(2014, 7, 1, 0): datetime(2014, 6, 30),
- datetime(2014, 7, 7, 10): datetime(2014, 7, 4),
- datetime(2014, 7, 7, 10, 1): datetime(2014, 7, 7),
- datetime(2014, 7, 5, 23): datetime(2014, 7, 4),
- datetime(2014, 7, 6, 10): datetime(2014, 7, 4),
- },
- )
- )
- normalize_cases.append(
- (
- BusinessHour(1, normalize=True, start="17:00", end="04:00"),
- {
- datetime(2014, 7, 1, 8): datetime(2014, 7, 1),
- datetime(2014, 7, 1, 17): datetime(2014, 7, 1),
- datetime(2014, 7, 1, 23): datetime(2014, 7, 2),
- datetime(2014, 7, 2, 2): datetime(2014, 7, 2),
- datetime(2014, 7, 2, 3): datetime(2014, 7, 2),
- datetime(2014, 7, 4, 23): datetime(2014, 7, 5),
- datetime(2014, 7, 5, 2): datetime(2014, 7, 5),
- datetime(2014, 7, 7, 2): datetime(2014, 7, 7),
- datetime(2014, 7, 7, 17): datetime(2014, 7, 7),
- },
- )
- )
- @pytest.mark.parametrize("case", normalize_cases)
- def test_normalize(self, case):
- offset, cases = case
- for dt, expected in cases.items():
- assert offset._apply(dt) == expected
- on_offset_cases = []
- on_offset_cases.append(
- (
- BusinessHour(),
- {
- datetime(2014, 7, 1, 9): True,
- datetime(2014, 7, 1, 8, 59): False,
- datetime(2014, 7, 1, 8): False,
- datetime(2014, 7, 1, 17): True,
- datetime(2014, 7, 1, 17, 1): False,
- datetime(2014, 7, 1, 18): False,
- datetime(2014, 7, 5, 9): False,
- datetime(2014, 7, 6, 12): False,
- },
- )
- )
- on_offset_cases.append(
- (
- BusinessHour(start="10:00", end="15:00"),
- {
- datetime(2014, 7, 1, 9): False,
- datetime(2014, 7, 1, 10): True,
- datetime(2014, 7, 1, 15): True,
- datetime(2014, 7, 1, 15, 1): False,
- datetime(2014, 7, 5, 12): False,
- datetime(2014, 7, 6, 12): False,
- },
- )
- )
- on_offset_cases.append(
- (
- BusinessHour(start="19:00", end="05:00"),
- {
- datetime(2014, 7, 1, 9, 0): False,
- datetime(2014, 7, 1, 10, 0): False,
- datetime(2014, 7, 1, 15): False,
- datetime(2014, 7, 1, 15, 1): False,
- datetime(2014, 7, 5, 12, 0): False,
- datetime(2014, 7, 6, 12, 0): False,
- datetime(2014, 7, 1, 19, 0): True,
- datetime(2014, 7, 2, 0, 0): True,
- datetime(2014, 7, 4, 23): True,
- datetime(2014, 7, 5, 1): True,
- datetime(2014, 7, 5, 5, 0): True,
- datetime(2014, 7, 6, 23, 0): False,
- datetime(2014, 7, 7, 3, 0): False,
- },
- )
- )
- on_offset_cases.append(
- (
- BusinessHour(start=["09:00", "13:00"], end=["12:00", "17:00"]),
- {
- datetime(2014, 7, 1, 9): True,
- datetime(2014, 7, 1, 8, 59): False,
- datetime(2014, 7, 1, 8): False,
- datetime(2014, 7, 1, 17): True,
- datetime(2014, 7, 1, 17, 1): False,
- datetime(2014, 7, 1, 18): False,
- datetime(2014, 7, 5, 9): False,
- datetime(2014, 7, 6, 12): False,
- datetime(2014, 7, 1, 12, 30): False,
- },
- )
- )
- on_offset_cases.append(
- (
- BusinessHour(start=["19:00", "23:00"], end=["21:00", "05:00"]),
- {
- datetime(2014, 7, 1, 9, 0): False,
- datetime(2014, 7, 1, 10, 0): False,
- datetime(2014, 7, 1, 15): False,
- datetime(2014, 7, 1, 15, 1): False,
- datetime(2014, 7, 5, 12, 0): False,
- datetime(2014, 7, 6, 12, 0): False,
- datetime(2014, 7, 1, 19, 0): True,
- datetime(2014, 7, 2, 0, 0): True,
- datetime(2014, 7, 4, 23): True,
- datetime(2014, 7, 5, 1): True,
- datetime(2014, 7, 5, 5, 0): True,
- datetime(2014, 7, 6, 23, 0): False,
- datetime(2014, 7, 7, 3, 0): False,
- datetime(2014, 7, 4, 22): False,
- },
- )
- )
- @pytest.mark.parametrize("case", on_offset_cases)
- def test_is_on_offset(self, case):
- offset, cases = case
- for dt, expected in cases.items():
- assert offset.is_on_offset(dt) == expected
- apply_cases = [
- (
- BusinessHour(),
- {
- datetime(2014, 7, 1, 11): datetime(2014, 7, 1, 12),
- datetime(2014, 7, 1, 13): datetime(2014, 7, 1, 14),
- datetime(2014, 7, 1, 15): datetime(2014, 7, 1, 16),
- datetime(2014, 7, 1, 19): datetime(2014, 7, 2, 10),
- datetime(2014, 7, 1, 16): datetime(2014, 7, 2, 9),
- datetime(2014, 7, 1, 16, 30, 15): datetime(2014, 7, 2, 9, 30, 15),
- datetime(2014, 7, 1, 17): datetime(2014, 7, 2, 10),
- datetime(2014, 7, 2, 11): datetime(2014, 7, 2, 12),
- # out of business hours
- datetime(2014, 7, 2, 8): datetime(2014, 7, 2, 10),
- datetime(2014, 7, 2, 19): datetime(2014, 7, 3, 10),
- datetime(2014, 7, 2, 23): datetime(2014, 7, 3, 10),
- datetime(2014, 7, 3, 0): datetime(2014, 7, 3, 10),
- # saturday
- datetime(2014, 7, 5, 15): datetime(2014, 7, 7, 10),
- datetime(2014, 7, 4, 17): datetime(2014, 7, 7, 10),
- datetime(2014, 7, 4, 16, 30): datetime(2014, 7, 7, 9, 30),
- datetime(2014, 7, 4, 16, 30, 30): datetime(2014, 7, 7, 9, 30, 30),
- },
- ),
- (
- BusinessHour(4),
- {
- datetime(2014, 7, 1, 11): datetime(2014, 7, 1, 15),
- datetime(2014, 7, 1, 13): datetime(2014, 7, 2, 9),
- datetime(2014, 7, 1, 15): datetime(2014, 7, 2, 11),
- datetime(2014, 7, 1, 16): datetime(2014, 7, 2, 12),
- datetime(2014, 7, 1, 17): datetime(2014, 7, 2, 13),
- datetime(2014, 7, 2, 11): datetime(2014, 7, 2, 15),
- datetime(2014, 7, 2, 8): datetime(2014, 7, 2, 13),
- datetime(2014, 7, 2, 19): datetime(2014, 7, 3, 13),
- datetime(2014, 7, 2, 23): datetime(2014, 7, 3, 13),
- datetime(2014, 7, 3, 0): datetime(2014, 7, 3, 13),
- datetime(2014, 7, 5, 15): datetime(2014, 7, 7, 13),
- datetime(2014, 7, 4, 17): datetime(2014, 7, 7, 13),
- datetime(2014, 7, 4, 16, 30): datetime(2014, 7, 7, 12, 30),
- datetime(2014, 7, 4, 16, 30, 30): datetime(2014, 7, 7, 12, 30, 30),
- },
- ),
- (
- BusinessHour(-1),
- {
- datetime(2014, 7, 1, 11): datetime(2014, 7, 1, 10),
- datetime(2014, 7, 1, 13): datetime(2014, 7, 1, 12),
- datetime(2014, 7, 1, 15): datetime(2014, 7, 1, 14),
- datetime(2014, 7, 1, 16): datetime(2014, 7, 1, 15),
- datetime(2014, 7, 1, 10): datetime(2014, 6, 30, 17),
- datetime(2014, 7, 1, 16, 30, 15): datetime(2014, 7, 1, 15, 30, 15),
- datetime(2014, 7, 1, 9, 30, 15): datetime(2014, 6, 30, 16, 30, 15),
- datetime(2014, 7, 1, 17): datetime(2014, 7, 1, 16),
- datetime(2014, 7, 1, 5): datetime(2014, 6, 30, 16),
- datetime(2014, 7, 2, 11): datetime(2014, 7, 2, 10),
- # out of business hours
- datetime(2014, 7, 2, 8): datetime(2014, 7, 1, 16),
- datetime(2014, 7, 2, 19): datetime(2014, 7, 2, 16),
- datetime(2014, 7, 2, 23): datetime(2014, 7, 2, 16),
- datetime(2014, 7, 3, 0): datetime(2014, 7, 2, 16),
- # saturday
- datetime(2014, 7, 5, 15): datetime(2014, 7, 4, 16),
- datetime(2014, 7, 7, 9): datetime(2014, 7, 4, 16),
- datetime(2014, 7, 7, 9, 30): datetime(2014, 7, 4, 16, 30),
- datetime(2014, 7, 7, 9, 30, 30): datetime(2014, 7, 4, 16, 30, 30),
- },
- ),
- (
- BusinessHour(-4),
- {
- datetime(2014, 7, 1, 11): datetime(2014, 6, 30, 15),
- datetime(2014, 7, 1, 13): datetime(2014, 6, 30, 17),
- datetime(2014, 7, 1, 15): datetime(2014, 7, 1, 11),
- datetime(2014, 7, 1, 16): datetime(2014, 7, 1, 12),
- datetime(2014, 7, 1, 17): datetime(2014, 7, 1, 13),
- datetime(2014, 7, 2, 11): datetime(2014, 7, 1, 15),
- datetime(2014, 7, 2, 8): datetime(2014, 7, 1, 13),
- datetime(2014, 7, 2, 19): datetime(2014, 7, 2, 13),
- datetime(2014, 7, 2, 23): datetime(2014, 7, 2, 13),
- datetime(2014, 7, 3, 0): datetime(2014, 7, 2, 13),
- datetime(2014, 7, 5, 15): datetime(2014, 7, 4, 13),
- datetime(2014, 7, 4, 18): datetime(2014, 7, 4, 13),
- datetime(2014, 7, 7, 9, 30): datetime(2014, 7, 4, 13, 30),
- datetime(2014, 7, 7, 9, 30, 30): datetime(2014, 7, 4, 13, 30, 30),
- },
- ),
- (
- BusinessHour(start="13:00", end="16:00"),
- {
- datetime(2014, 7, 1, 11): datetime(2014, 7, 1, 14),
- datetime(2014, 7, 1, 13): datetime(2014, 7, 1, 14),
- datetime(2014, 7, 1, 15): datetime(2014, 7, 2, 13),
- datetime(2014, 7, 1, 19): datetime(2014, 7, 2, 14),
- datetime(2014, 7, 1, 16): datetime(2014, 7, 2, 14),
- datetime(2014, 7, 1, 15, 30, 15): datetime(2014, 7, 2, 13, 30, 15),
- datetime(2014, 7, 5, 15): datetime(2014, 7, 7, 14),
- datetime(2014, 7, 4, 17): datetime(2014, 7, 7, 14),
- },
- ),
- (
- BusinessHour(n=2, start="13:00", end="16:00"),
- {
- datetime(2014, 7, 1, 17): datetime(2014, 7, 2, 15),
- datetime(2014, 7, 2, 14): datetime(2014, 7, 3, 13),
- datetime(2014, 7, 2, 8): datetime(2014, 7, 2, 15),
- datetime(2014, 7, 2, 19): datetime(2014, 7, 3, 15),
- datetime(2014, 7, 2, 14, 30): datetime(2014, 7, 3, 13, 30),
- datetime(2014, 7, 3, 0): datetime(2014, 7, 3, 15),
- datetime(2014, 7, 5, 15): datetime(2014, 7, 7, 15),
- datetime(2014, 7, 4, 17): datetime(2014, 7, 7, 15),
- datetime(2014, 7, 4, 14, 30): datetime(2014, 7, 7, 13, 30),
- datetime(2014, 7, 4, 14, 30, 30): datetime(2014, 7, 7, 13, 30, 30),
- },
- ),
- (
- BusinessHour(n=-1, start="13:00", end="16:00"),
- {
- datetime(2014, 7, 2, 11): datetime(2014, 7, 1, 15),
- datetime(2014, 7, 2, 13): datetime(2014, 7, 1, 15),
- datetime(2014, 7, 2, 14): datetime(2014, 7, 1, 16),
- datetime(2014, 7, 2, 15): datetime(2014, 7, 2, 14),
- datetime(2014, 7, 2, 19): datetime(2014, 7, 2, 15),
- datetime(2014, 7, 2, 16): datetime(2014, 7, 2, 15),
- datetime(2014, 7, 2, 13, 30, 15): datetime(2014, 7, 1, 15, 30, 15),
- datetime(2014, 7, 5, 15): datetime(2014, 7, 4, 15),
- datetime(2014, 7, 7, 11): datetime(2014, 7, 4, 15),
- },
- ),
- (
- BusinessHour(n=-3, start="10:00", end="16:00"),
- {
- datetime(2014, 7, 1, 17): datetime(2014, 7, 1, 13),
- datetime(2014, 7, 2, 14): datetime(2014, 7, 2, 11),
- datetime(2014, 7, 2, 8): datetime(2014, 7, 1, 13),
- datetime(2014, 7, 2, 13): datetime(2014, 7, 1, 16),
- datetime(2014, 7, 2, 19): datetime(2014, 7, 2, 13),
- datetime(2014, 7, 2, 11, 30): datetime(2014, 7, 1, 14, 30),
- datetime(2014, 7, 3, 0): datetime(2014, 7, 2, 13),
- datetime(2014, 7, 4, 10): datetime(2014, 7, 3, 13),
- datetime(2014, 7, 5, 15): datetime(2014, 7, 4, 13),
- datetime(2014, 7, 4, 16): datetime(2014, 7, 4, 13),
- datetime(2014, 7, 4, 12, 30): datetime(2014, 7, 3, 15, 30),
- datetime(2014, 7, 4, 12, 30, 30): datetime(2014, 7, 3, 15, 30, 30),
- },
- ),
- (
- BusinessHour(start="19:00", end="05:00"),
- {
- datetime(2014, 7, 1, 17): datetime(2014, 7, 1, 20),
- datetime(2014, 7, 2, 14): datetime(2014, 7, 2, 20),
- datetime(2014, 7, 2, 8): datetime(2014, 7, 2, 20),
- datetime(2014, 7, 2, 13): datetime(2014, 7, 2, 20),
- datetime(2014, 7, 2, 19): datetime(2014, 7, 2, 20),
- datetime(2014, 7, 2, 4, 30): datetime(2014, 7, 2, 19, 30),
- datetime(2014, 7, 3, 0): datetime(2014, 7, 3, 1),
- datetime(2014, 7, 4, 10): datetime(2014, 7, 4, 20),
- datetime(2014, 7, 4, 23): datetime(2014, 7, 5, 0),
- datetime(2014, 7, 5, 0): datetime(2014, 7, 5, 1),
- datetime(2014, 7, 5, 4): datetime(2014, 7, 7, 19),
- datetime(2014, 7, 5, 4, 30): datetime(2014, 7, 7, 19, 30),
- datetime(2014, 7, 5, 4, 30, 30): datetime(2014, 7, 7, 19, 30, 30),
- },
- ),
- (
- BusinessHour(n=-1, start="19:00", end="05:00"),
- {
- datetime(2014, 7, 1, 17): datetime(2014, 7, 1, 4),
- datetime(2014, 7, 2, 14): datetime(2014, 7, 2, 4),
- datetime(2014, 7, 2, 8): datetime(2014, 7, 2, 4),
- datetime(2014, 7, 2, 13): datetime(2014, 7, 2, 4),
- datetime(2014, 7, 2, 20): datetime(2014, 7, 2, 5),
- datetime(2014, 7, 2, 19): datetime(2014, 7, 2, 4),
- datetime(2014, 7, 2, 19, 30): datetime(2014, 7, 2, 4, 30),
- datetime(2014, 7, 3, 0): datetime(2014, 7, 2, 23),
- datetime(2014, 7, 3, 6): datetime(2014, 7, 3, 4),
- datetime(2014, 7, 4, 23): datetime(2014, 7, 4, 22),
- datetime(2014, 7, 5, 0): datetime(2014, 7, 4, 23),
- datetime(2014, 7, 5, 4): datetime(2014, 7, 5, 3),
- datetime(2014, 7, 7, 19, 30): datetime(2014, 7, 5, 4, 30),
- datetime(2014, 7, 7, 19, 30, 30): datetime(2014, 7, 5, 4, 30, 30),
- },
- ),
- (
- BusinessHour(n=4, start="00:00", end="23:00"),
- {
- datetime(2014, 7, 3, 22): datetime(2014, 7, 4, 3),
- datetime(2014, 7, 4, 22): datetime(2014, 7, 7, 3),
- datetime(2014, 7, 3, 22, 30): datetime(2014, 7, 4, 3, 30),
- datetime(2014, 7, 3, 22, 20): datetime(2014, 7, 4, 3, 20),
- datetime(2014, 7, 4, 22, 30, 30): datetime(2014, 7, 7, 3, 30, 30),
- datetime(2014, 7, 4, 22, 30, 20): datetime(2014, 7, 7, 3, 30, 20),
- },
- ),
- (
- BusinessHour(n=-4, start="00:00", end="23:00"),
- {
- datetime(2014, 7, 4, 3): datetime(2014, 7, 3, 22),
- datetime(2014, 7, 7, 3): datetime(2014, 7, 4, 22),
- datetime(2014, 7, 4, 3, 30): datetime(2014, 7, 3, 22, 30),
- datetime(2014, 7, 4, 3, 20): datetime(2014, 7, 3, 22, 20),
- datetime(2014, 7, 7, 3, 30, 30): datetime(2014, 7, 4, 22, 30, 30),
- datetime(2014, 7, 7, 3, 30, 20): datetime(2014, 7, 4, 22, 30, 20),
- },
- ),
- (
- BusinessHour(start=["09:00", "14:00"], end=["12:00", "18:00"]),
- {
- datetime(2014, 7, 1, 11): datetime(2014, 7, 1, 14),
- datetime(2014, 7, 1, 15): datetime(2014, 7, 1, 16),
- datetime(2014, 7, 1, 19): datetime(2014, 7, 2, 10),
- datetime(2014, 7, 1, 16): datetime(2014, 7, 1, 17),
- datetime(2014, 7, 1, 16, 30, 15): datetime(2014, 7, 1, 17, 30, 15),
- datetime(2014, 7, 1, 17): datetime(2014, 7, 2, 9),
- datetime(2014, 7, 2, 11): datetime(2014, 7, 2, 14),
- # out of business hours
- datetime(2014, 7, 1, 13): datetime(2014, 7, 1, 15),
- datetime(2014, 7, 2, 8): datetime(2014, 7, 2, 10),
- datetime(2014, 7, 2, 19): datetime(2014, 7, 3, 10),
- datetime(2014, 7, 2, 23): datetime(2014, 7, 3, 10),
- datetime(2014, 7, 3, 0): datetime(2014, 7, 3, 10),
- # saturday
- datetime(2014, 7, 5, 15): datetime(2014, 7, 7, 10),
- datetime(2014, 7, 4, 17): datetime(2014, 7, 7, 9),
- datetime(2014, 7, 4, 17, 30): datetime(2014, 7, 7, 9, 30),
- datetime(2014, 7, 4, 17, 30, 30): datetime(2014, 7, 7, 9, 30, 30),
- },
- ),
- (
- BusinessHour(n=4, start=["09:00", "14:00"], end=["12:00", "18:00"]),
- {
- datetime(2014, 7, 1, 11): datetime(2014, 7, 1, 17),
- datetime(2014, 7, 1, 13): datetime(2014, 7, 2, 9),
- datetime(2014, 7, 1, 15): datetime(2014, 7, 2, 10),
- datetime(2014, 7, 1, 16): datetime(2014, 7, 2, 11),
- datetime(2014, 7, 1, 17): datetime(2014, 7, 2, 14),
- datetime(2014, 7, 2, 11): datetime(2014, 7, 2, 17),
- datetime(2014, 7, 2, 8): datetime(2014, 7, 2, 15),
- datetime(2014, 7, 2, 19): datetime(2014, 7, 3, 15),
- datetime(2014, 7, 2, 23): datetime(2014, 7, 3, 15),
- datetime(2014, 7, 3, 0): datetime(2014, 7, 3, 15),
- datetime(2014, 7, 5, 15): datetime(2014, 7, 7, 15),
- datetime(2014, 7, 4, 17): datetime(2014, 7, 7, 14),
- datetime(2014, 7, 4, 16, 30): datetime(2014, 7, 7, 11, 30),
- datetime(2014, 7, 4, 16, 30, 30): datetime(2014, 7, 7, 11, 30, 30),
- },
- ),
- (
- BusinessHour(n=-4, start=["09:00", "14:00"], end=["12:00", "18:00"]),
- {
- datetime(2014, 7, 1, 11): datetime(2014, 6, 30, 16),
- datetime(2014, 7, 1, 13): datetime(2014, 6, 30, 17),
- datetime(2014, 7, 1, 15): datetime(2014, 6, 30, 18),
- datetime(2014, 7, 1, 16): datetime(2014, 7, 1, 10),
- datetime(2014, 7, 1, 17): datetime(2014, 7, 1, 11),
- datetime(2014, 7, 2, 11): datetime(2014, 7, 1, 16),
- datetime(2014, 7, 2, 8): datetime(2014, 7, 1, 12),
- datetime(2014, 7, 2, 19): datetime(2014, 7, 2, 12),
- datetime(2014, 7, 2, 23): datetime(2014, 7, 2, 12),
- datetime(2014, 7, 3, 0): datetime(2014, 7, 2, 12),
- datetime(2014, 7, 5, 15): datetime(2014, 7, 4, 12),
- datetime(2014, 7, 4, 18): datetime(2014, 7, 4, 12),
- datetime(2014, 7, 7, 9, 30): datetime(2014, 7, 4, 14, 30),
- datetime(2014, 7, 7, 9, 30, 30): datetime(2014, 7, 4, 14, 30, 30),
- },
- ),
- (
- BusinessHour(n=-1, start=["19:00", "03:00"], end=["01:00", "05:00"]),
- {
- datetime(2014, 7, 1, 17): datetime(2014, 7, 1, 4),
- datetime(2014, 7, 2, 14): datetime(2014, 7, 2, 4),
- datetime(2014, 7, 2, 8): datetime(2014, 7, 2, 4),
- datetime(2014, 7, 2, 13): datetime(2014, 7, 2, 4),
- datetime(2014, 7, 2, 20): datetime(2014, 7, 2, 5),
- datetime(2014, 7, 2, 19): datetime(2014, 7, 2, 4),
- datetime(2014, 7, 2, 4): datetime(2014, 7, 2, 1),
- datetime(2014, 7, 2, 19, 30): datetime(2014, 7, 2, 4, 30),
- datetime(2014, 7, 3, 0): datetime(2014, 7, 2, 23),
- datetime(2014, 7, 3, 6): datetime(2014, 7, 3, 4),
- datetime(2014, 7, 4, 23): datetime(2014, 7, 4, 22),
- datetime(2014, 7, 5, 0): datetime(2014, 7, 4, 23),
- datetime(2014, 7, 5, 4): datetime(2014, 7, 5, 0),
- datetime(2014, 7, 7, 3, 30): datetime(2014, 7, 5, 0, 30),
- datetime(2014, 7, 7, 19, 30): datetime(2014, 7, 7, 4, 30),
- datetime(2014, 7, 7, 19, 30, 30): datetime(2014, 7, 7, 4, 30, 30),
- },
- ),
- ]
- # long business hours (see gh-26381)
- # multiple business hours
- @pytest.mark.parametrize("case", apply_cases)
- def test_apply(self, case):
- offset, cases = case
- for base, expected in cases.items():
- assert_offset_equal(offset, base, expected)
- apply_large_n_cases = [
- (
- # A week later
- BusinessHour(40),
- {
- datetime(2014, 7, 1, 11): datetime(2014, 7, 8, 11),
- datetime(2014, 7, 1, 13): datetime(2014, 7, 8, 13),
- datetime(2014, 7, 1, 15): datetime(2014, 7, 8, 15),
- datetime(2014, 7, 1, 16): datetime(2014, 7, 8, 16),
- datetime(2014, 7, 1, 17): datetime(2014, 7, 9, 9),
- datetime(2014, 7, 2, 11): datetime(2014, 7, 9, 11),
- datetime(2014, 7, 2, 8): datetime(2014, 7, 9, 9),
- datetime(2014, 7, 2, 19): datetime(2014, 7, 10, 9),
- datetime(2014, 7, 2, 23): datetime(2014, 7, 10, 9),
- datetime(2014, 7, 3, 0): datetime(2014, 7, 10, 9),
- datetime(2014, 7, 5, 15): datetime(2014, 7, 14, 9),
- datetime(2014, 7, 4, 18): datetime(2014, 7, 14, 9),
- datetime(2014, 7, 7, 9, 30): datetime(2014, 7, 14, 9, 30),
- datetime(2014, 7, 7, 9, 30, 30): datetime(2014, 7, 14, 9, 30, 30),
- },
- ),
- (
- # 3 days and 1 hour before
- BusinessHour(-25),
- {
- datetime(2014, 7, 1, 11): datetime(2014, 6, 26, 10),
- datetime(2014, 7, 1, 13): datetime(2014, 6, 26, 12),
- datetime(2014, 7, 1, 9): datetime(2014, 6, 25, 16),
- datetime(2014, 7, 1, 10): datetime(2014, 6, 25, 17),
- datetime(2014, 7, 3, 11): datetime(2014, 6, 30, 10),
- datetime(2014, 7, 3, 8): datetime(2014, 6, 27, 16),
- datetime(2014, 7, 3, 19): datetime(2014, 6, 30, 16),
- datetime(2014, 7, 3, 23): datetime(2014, 6, 30, 16),
- datetime(2014, 7, 4, 9): datetime(2014, 6, 30, 16),
- datetime(2014, 7, 5, 15): datetime(2014, 7, 1, 16),
- datetime(2014, 7, 6, 18): datetime(2014, 7, 1, 16),
- datetime(2014, 7, 7, 9, 30): datetime(2014, 7, 1, 16, 30),
- datetime(2014, 7, 7, 10, 30, 30): datetime(2014, 7, 2, 9, 30, 30),
- },
- ),
- (
- # 5 days and 3 hours later
- BusinessHour(28, start="21:00", end="02:00"),
- {
- datetime(2014, 7, 1, 11): datetime(2014, 7, 9, 0),
- datetime(2014, 7, 1, 22): datetime(2014, 7, 9, 1),
- datetime(2014, 7, 1, 23): datetime(2014, 7, 9, 21),
- datetime(2014, 7, 2, 2): datetime(2014, 7, 10, 0),
- datetime(2014, 7, 3, 21): datetime(2014, 7, 11, 0),
- datetime(2014, 7, 4, 1): datetime(2014, 7, 11, 23),
- datetime(2014, 7, 4, 2): datetime(2014, 7, 12, 0),
- datetime(2014, 7, 4, 3): datetime(2014, 7, 12, 0),
- datetime(2014, 7, 5, 1): datetime(2014, 7, 14, 23),
- datetime(2014, 7, 5, 15): datetime(2014, 7, 15, 0),
- datetime(2014, 7, 6, 18): datetime(2014, 7, 15, 0),
- datetime(2014, 7, 7, 1): datetime(2014, 7, 15, 0),
- datetime(2014, 7, 7, 23, 30): datetime(2014, 7, 15, 21, 30),
- },
- ),
- (
- # large n for multiple opening hours (3 days and 1 hour before)
- BusinessHour(n=-25, start=["09:00", "14:00"], end=["12:00", "19:00"]),
- {
- datetime(2014, 7, 1, 11): datetime(2014, 6, 26, 10),
- datetime(2014, 7, 1, 13): datetime(2014, 6, 26, 11),
- datetime(2014, 7, 1, 9): datetime(2014, 6, 25, 18),
- datetime(2014, 7, 1, 10): datetime(2014, 6, 25, 19),
- datetime(2014, 7, 3, 11): datetime(2014, 6, 30, 10),
- datetime(2014, 7, 3, 8): datetime(2014, 6, 27, 18),
- datetime(2014, 7, 3, 19): datetime(2014, 6, 30, 18),
- datetime(2014, 7, 3, 23): datetime(2014, 6, 30, 18),
- datetime(2014, 7, 4, 9): datetime(2014, 6, 30, 18),
- datetime(2014, 7, 5, 15): datetime(2014, 7, 1, 18),
- datetime(2014, 7, 6, 18): datetime(2014, 7, 1, 18),
- datetime(2014, 7, 7, 9, 30): datetime(2014, 7, 1, 18, 30),
- datetime(2014, 7, 7, 10, 30, 30): datetime(2014, 7, 2, 9, 30, 30),
- },
- ),
- (
- # 5 days and 3 hours later
- BusinessHour(28, start=["21:00", "03:00"], end=["01:00", "04:00"]),
- {
- datetime(2014, 7, 1, 11): datetime(2014, 7, 9, 0),
- datetime(2014, 7, 1, 22): datetime(2014, 7, 9, 3),
- datetime(2014, 7, 1, 23): datetime(2014, 7, 9, 21),
- datetime(2014, 7, 2, 2): datetime(2014, 7, 9, 23),
- datetime(2014, 7, 3, 21): datetime(2014, 7, 11, 0),
- datetime(2014, 7, 4, 1): datetime(2014, 7, 11, 23),
- datetime(2014, 7, 4, 2): datetime(2014, 7, 11, 23),
- datetime(2014, 7, 4, 3): datetime(2014, 7, 11, 23),
- datetime(2014, 7, 4, 21): datetime(2014, 7, 12, 0),
- datetime(2014, 7, 5, 0): datetime(2014, 7, 14, 22),
- datetime(2014, 7, 5, 1): datetime(2014, 7, 14, 23),
- datetime(2014, 7, 5, 15): datetime(2014, 7, 14, 23),
- datetime(2014, 7, 6, 18): datetime(2014, 7, 14, 23),
- datetime(2014, 7, 7, 1): datetime(2014, 7, 14, 23),
- datetime(2014, 7, 7, 23, 30): datetime(2014, 7, 15, 21, 30),
- },
- ),
- ]
- @pytest.mark.parametrize("case", apply_large_n_cases)
- def test_apply_large_n(self, case):
- offset, cases = case
- for base, expected in cases.items():
- assert_offset_equal(offset, base, expected)
- def test_apply_nanoseconds(self):
- tests = [
- (
- BusinessHour(),
- {
- Timestamp("2014-07-04 15:00")
- + Nano(5): Timestamp("2014-07-04 16:00")
- + Nano(5),
- Timestamp("2014-07-04 16:00")
- + Nano(5): Timestamp("2014-07-07 09:00")
- + Nano(5),
- Timestamp("2014-07-04 16:00")
- - Nano(5): Timestamp("2014-07-04 17:00")
- - Nano(5),
- },
- ),
- (
- BusinessHour(-1),
- {
- Timestamp("2014-07-04 15:00")
- + Nano(5): Timestamp("2014-07-04 14:00")
- + Nano(5),
- Timestamp("2014-07-04 10:00")
- + Nano(5): Timestamp("2014-07-04 09:00")
- + Nano(5),
- Timestamp("2014-07-04 10:00")
- - Nano(5): Timestamp("2014-07-03 17:00")
- - Nano(5),
- },
- ),
- ]
- for offset, cases in tests:
- for base, expected in cases.items():
- assert_offset_equal(offset, base, expected)
- def test_datetimeindex(self):
- idx1 = date_range(start="2014-07-04 15:00", end="2014-07-08 10:00", freq="BH")
- idx2 = date_range(start="2014-07-04 15:00", periods=12, freq="BH")
- idx3 = date_range(end="2014-07-08 10:00", periods=12, freq="BH")
- expected = DatetimeIndex(
- [
- "2014-07-04 15:00",
- "2014-07-04 16:00",
- "2014-07-07 09:00",
- "2014-07-07 10:00",
- "2014-07-07 11:00",
- "2014-07-07 12:00",
- "2014-07-07 13:00",
- "2014-07-07 14:00",
- "2014-07-07 15:00",
- "2014-07-07 16:00",
- "2014-07-08 09:00",
- "2014-07-08 10:00",
- ],
- freq="BH",
- )
- for idx in [idx1, idx2, idx3]:
- tm.assert_index_equal(idx, expected)
- idx1 = date_range(start="2014-07-04 15:45", end="2014-07-08 10:45", freq="BH")
- idx2 = date_range(start="2014-07-04 15:45", periods=12, freq="BH")
- idx3 = date_range(end="2014-07-08 10:45", periods=12, freq="BH")
- expected = idx1
- for idx in [idx1, idx2, idx3]:
- tm.assert_index_equal(idx, expected)
- def test_short_datetimeindex_creation(self):
- # gh-49835
- idx4 = date_range(start="2014-07-01 10:00", freq="BH", periods=1)
- expected4 = DatetimeIndex(["2014-07-01 10:00"], freq="BH")
- tm.assert_index_equal(idx4, expected4)
- def test_bday_ignores_timedeltas(self):
- idx = date_range("2010/02/01", "2010/02/10", freq="12H")
- t1 = idx + BDay(offset=Timedelta(3, unit="H"))
- expected = DatetimeIndex(
- [
- "2010-02-02 03:00:00",
- "2010-02-02 15:00:00",
- "2010-02-03 03:00:00",
- "2010-02-03 15:00:00",
- "2010-02-04 03:00:00",
- "2010-02-04 15:00:00",
- "2010-02-05 03:00:00",
- "2010-02-05 15:00:00",
- "2010-02-08 03:00:00",
- "2010-02-08 15:00:00",
- "2010-02-08 03:00:00",
- "2010-02-08 15:00:00",
- "2010-02-08 03:00:00",
- "2010-02-08 15:00:00",
- "2010-02-09 03:00:00",
- "2010-02-09 15:00:00",
- "2010-02-10 03:00:00",
- "2010-02-10 15:00:00",
- "2010-02-11 03:00:00",
- ],
- freq=None,
- )
- tm.assert_index_equal(t1, expected)
- class TestOpeningTimes:
- # opening time should be affected by sign of n, not by n's value and end
- opening_time_cases = [
- (
- [
- BusinessHour(),
- BusinessHour(n=2),
- BusinessHour(n=4),
- BusinessHour(end="10:00"),
- BusinessHour(n=2, end="4:00"),
- BusinessHour(n=4, end="15:00"),
- ],
- {
- datetime(2014, 7, 1, 11): (
- datetime(2014, 7, 2, 9),
- datetime(2014, 7, 1, 9),
- ),
- datetime(2014, 7, 1, 18): (
- datetime(2014, 7, 2, 9),
- datetime(2014, 7, 1, 9),
- ),
- datetime(2014, 7, 1, 23): (
- datetime(2014, 7, 2, 9),
- datetime(2014, 7, 1, 9),
- ),
- datetime(2014, 7, 2, 8): (
- datetime(2014, 7, 2, 9),
- datetime(2014, 7, 1, 9),
- ),
- # if timestamp is on opening time, next opening time is
- # as it is
- datetime(2014, 7, 2, 9): (
- datetime(2014, 7, 2, 9),
- datetime(2014, 7, 2, 9),
- ),
- datetime(2014, 7, 2, 10): (
- datetime(2014, 7, 3, 9),
- datetime(2014, 7, 2, 9),
- ),
- # 2014-07-05 is saturday
- datetime(2014, 7, 5, 10): (
- datetime(2014, 7, 7, 9),
- datetime(2014, 7, 4, 9),
- ),
- datetime(2014, 7, 4, 10): (
- datetime(2014, 7, 7, 9),
- datetime(2014, 7, 4, 9),
- ),
- datetime(2014, 7, 4, 23): (
- datetime(2014, 7, 7, 9),
- datetime(2014, 7, 4, 9),
- ),
- datetime(2014, 7, 6, 10): (
- datetime(2014, 7, 7, 9),
- datetime(2014, 7, 4, 9),
- ),
- datetime(2014, 7, 7, 5): (
- datetime(2014, 7, 7, 9),
- datetime(2014, 7, 4, 9),
- ),
- datetime(2014, 7, 7, 9, 1): (
- datetime(2014, 7, 8, 9),
- datetime(2014, 7, 7, 9),
- ),
- },
- ),
- (
- [
- BusinessHour(start="11:15"),
- BusinessHour(n=2, start="11:15"),
- BusinessHour(n=3, start="11:15"),
- BusinessHour(start="11:15", end="10:00"),
- BusinessHour(n=2, start="11:15", end="4:00"),
- BusinessHour(n=3, start="11:15", end="15:00"),
- ],
- {
- datetime(2014, 7, 1, 11): (
- datetime(2014, 7, 1, 11, 15),
- datetime(2014, 6, 30, 11, 15),
- ),
- datetime(2014, 7, 1, 18): (
- datetime(2014, 7, 2, 11, 15),
- datetime(2014, 7, 1, 11, 15),
- ),
- datetime(2014, 7, 1, 23): (
- datetime(2014, 7, 2, 11, 15),
- datetime(2014, 7, 1, 11, 15),
- ),
- datetime(2014, 7, 2, 8): (
- datetime(2014, 7, 2, 11, 15),
- datetime(2014, 7, 1, 11, 15),
- ),
- datetime(2014, 7, 2, 9): (
- datetime(2014, 7, 2, 11, 15),
- datetime(2014, 7, 1, 11, 15),
- ),
- datetime(2014, 7, 2, 10): (
- datetime(2014, 7, 2, 11, 15),
- datetime(2014, 7, 1, 11, 15),
- ),
- datetime(2014, 7, 2, 11, 15): (
- datetime(2014, 7, 2, 11, 15),
- datetime(2014, 7, 2, 11, 15),
- ),
- datetime(2014, 7, 2, 11, 15, 1): (
- datetime(2014, 7, 3, 11, 15),
- datetime(2014, 7, 2, 11, 15),
- ),
- datetime(2014, 7, 5, 10): (
- datetime(2014, 7, 7, 11, 15),
- datetime(2014, 7, 4, 11, 15),
- ),
- datetime(2014, 7, 4, 10): (
- datetime(2014, 7, 4, 11, 15),
- datetime(2014, 7, 3, 11, 15),
- ),
- datetime(2014, 7, 4, 23): (
- datetime(2014, 7, 7, 11, 15),
- datetime(2014, 7, 4, 11, 15),
- ),
- datetime(2014, 7, 6, 10): (
- datetime(2014, 7, 7, 11, 15),
- datetime(2014, 7, 4, 11, 15),
- ),
- datetime(2014, 7, 7, 5): (
- datetime(2014, 7, 7, 11, 15),
- datetime(2014, 7, 4, 11, 15),
- ),
- datetime(2014, 7, 7, 9, 1): (
- datetime(2014, 7, 7, 11, 15),
- datetime(2014, 7, 4, 11, 15),
- ),
- },
- ),
- (
- [
- BusinessHour(-1),
- BusinessHour(n=-2),
- BusinessHour(n=-4),
- BusinessHour(n=-1, end="10:00"),
- BusinessHour(n=-2, end="4:00"),
- BusinessHour(n=-4, end="15:00"),
- ],
- {
- datetime(2014, 7, 1, 11): (
- datetime(2014, 7, 1, 9),
- datetime(2014, 7, 2, 9),
- ),
- datetime(2014, 7, 1, 18): (
- datetime(2014, 7, 1, 9),
- datetime(2014, 7, 2, 9),
- ),
- datetime(2014, 7, 1, 23): (
- datetime(2014, 7, 1, 9),
- datetime(2014, 7, 2, 9),
- ),
- datetime(2014, 7, 2, 8): (
- datetime(2014, 7, 1, 9),
- datetime(2014, 7, 2, 9),
- ),
- datetime(2014, 7, 2, 9): (
- datetime(2014, 7, 2, 9),
- datetime(2014, 7, 2, 9),
- ),
- datetime(2014, 7, 2, 10): (
- datetime(2014, 7, 2, 9),
- datetime(2014, 7, 3, 9),
- ),
- datetime(2014, 7, 5, 10): (
- datetime(2014, 7, 4, 9),
- datetime(2014, 7, 7, 9),
- ),
- datetime(2014, 7, 4, 10): (
- datetime(2014, 7, 4, 9),
- datetime(2014, 7, 7, 9),
- ),
- datetime(2014, 7, 4, 23): (
- datetime(2014, 7, 4, 9),
- datetime(2014, 7, 7, 9),
- ),
- datetime(2014, 7, 6, 10): (
- datetime(2014, 7, 4, 9),
- datetime(2014, 7, 7, 9),
- ),
- datetime(2014, 7, 7, 5): (
- datetime(2014, 7, 4, 9),
- datetime(2014, 7, 7, 9),
- ),
- datetime(2014, 7, 7, 9): (
- datetime(2014, 7, 7, 9),
- datetime(2014, 7, 7, 9),
- ),
- datetime(2014, 7, 7, 9, 1): (
- datetime(2014, 7, 7, 9),
- datetime(2014, 7, 8, 9),
- ),
- },
- ),
- (
- [
- BusinessHour(start="17:00", end="05:00"),
- BusinessHour(n=3, start="17:00", end="03:00"),
- ],
- {
- datetime(2014, 7, 1, 11): (
- datetime(2014, 7, 1, 17),
- datetime(2014, 6, 30, 17),
- ),
- datetime(2014, 7, 1, 18): (
- datetime(2014, 7, 2, 17),
- datetime(2014, 7, 1, 17),
- ),
- datetime(2014, 7, 1, 23): (
- datetime(2014, 7, 2, 17),
- datetime(2014, 7, 1, 17),
- ),
- datetime(2014, 7, 2, 8): (
- datetime(2014, 7, 2, 17),
- datetime(2014, 7, 1, 17),
- ),
- datetime(2014, 7, 2, 9): (
- datetime(2014, 7, 2, 17),
- datetime(2014, 7, 1, 17),
- ),
- datetime(2014, 7, 4, 17): (
- datetime(2014, 7, 4, 17),
- datetime(2014, 7, 4, 17),
- ),
- datetime(2014, 7, 5, 10): (
- datetime(2014, 7, 7, 17),
- datetime(2014, 7, 4, 17),
- ),
- datetime(2014, 7, 4, 10): (
- datetime(2014, 7, 4, 17),
- datetime(2014, 7, 3, 17),
- ),
- datetime(2014, 7, 4, 23): (
- datetime(2014, 7, 7, 17),
- datetime(2014, 7, 4, 17),
- ),
- datetime(2014, 7, 6, 10): (
- datetime(2014, 7, 7, 17),
- datetime(2014, 7, 4, 17),
- ),
- datetime(2014, 7, 7, 5): (
- datetime(2014, 7, 7, 17),
- datetime(2014, 7, 4, 17),
- ),
- datetime(2014, 7, 7, 17, 1): (
- datetime(2014, 7, 8, 17),
- datetime(2014, 7, 7, 17),
- ),
- },
- ),
- (
- [
- BusinessHour(-1, start="17:00", end="05:00"),
- BusinessHour(n=-2, start="17:00", end="03:00"),
- ],
- {
- datetime(2014, 7, 1, 11): (
- datetime(2014, 6, 30, 17),
- datetime(2014, 7, 1, 17),
- ),
- datetime(2014, 7, 1, 18): (
- datetime(2014, 7, 1, 17),
- datetime(2014, 7, 2, 17),
- ),
- datetime(2014, 7, 1, 23): (
- datetime(2014, 7, 1, 17),
- datetime(2014, 7, 2, 17),
- ),
- datetime(2014, 7, 2, 8): (
- datetime(2014, 7, 1, 17),
- datetime(2014, 7, 2, 17),
- ),
- datetime(2014, 7, 2, 9): (
- datetime(2014, 7, 1, 17),
- datetime(2014, 7, 2, 17),
- ),
- datetime(2014, 7, 2, 16, 59): (
- datetime(2014, 7, 1, 17),
- datetime(2014, 7, 2, 17),
- ),
- datetime(2014, 7, 5, 10): (
- datetime(2014, 7, 4, 17),
- datetime(2014, 7, 7, 17),
- ),
- datetime(2014, 7, 4, 10): (
- datetime(2014, 7, 3, 17),
- datetime(2014, 7, 4, 17),
- ),
- datetime(2014, 7, 4, 23): (
- datetime(2014, 7, 4, 17),
- datetime(2014, 7, 7, 17),
- ),
- datetime(2014, 7, 6, 10): (
- datetime(2014, 7, 4, 17),
- datetime(2014, 7, 7, 17),
- ),
- datetime(2014, 7, 7, 5): (
- datetime(2014, 7, 4, 17),
- datetime(2014, 7, 7, 17),
- ),
- datetime(2014, 7, 7, 18): (
- datetime(2014, 7, 7, 17),
- datetime(2014, 7, 8, 17),
- ),
- },
- ),
- (
- [
- BusinessHour(start=["11:15", "15:00"], end=["13:00", "20:00"]),
- BusinessHour(n=3, start=["11:15", "15:00"], end=["12:00", "20:00"]),
- BusinessHour(start=["11:15", "15:00"], end=["13:00", "17:00"]),
- BusinessHour(n=2, start=["11:15", "15:00"], end=["12:00", "03:00"]),
- BusinessHour(n=3, start=["11:15", "15:00"], end=["13:00", "16:00"]),
- ],
- {
- datetime(2014, 7, 1, 11): (
- datetime(2014, 7, 1, 11, 15),
- datetime(2014, 6, 30, 15),
- ),
- datetime(2014, 7, 1, 18): (
- datetime(2014, 7, 2, 11, 15),
- datetime(2014, 7, 1, 15),
- ),
- datetime(2014, 7, 1, 23): (
- datetime(2014, 7, 2, 11, 15),
- datetime(2014, 7, 1, 15),
- ),
- datetime(2014, 7, 2, 8): (
- datetime(2014, 7, 2, 11, 15),
- datetime(2014, 7, 1, 15),
- ),
- datetime(2014, 7, 2, 9): (
- datetime(2014, 7, 2, 11, 15),
- datetime(2014, 7, 1, 15),
- ),
- datetime(2014, 7, 2, 10): (
- datetime(2014, 7, 2, 11, 15),
- datetime(2014, 7, 1, 15),
- ),
- datetime(2014, 7, 2, 11, 15): (
- datetime(2014, 7, 2, 11, 15),
- datetime(2014, 7, 2, 11, 15),
- ),
- datetime(2014, 7, 2, 11, 15, 1): (
- datetime(2014, 7, 2, 15),
- datetime(2014, 7, 2, 11, 15),
- ),
- datetime(2014, 7, 5, 10): (
- datetime(2014, 7, 7, 11, 15),
- datetime(2014, 7, 4, 15),
- ),
- datetime(2014, 7, 4, 10): (
- datetime(2014, 7, 4, 11, 15),
- datetime(2014, 7, 3, 15),
- ),
- datetime(2014, 7, 4, 23): (
- datetime(2014, 7, 7, 11, 15),
- datetime(2014, 7, 4, 15),
- ),
- datetime(2014, 7, 6, 10): (
- datetime(2014, 7, 7, 11, 15),
- datetime(2014, 7, 4, 15),
- ),
- datetime(2014, 7, 7, 5): (
- datetime(2014, 7, 7, 11, 15),
- datetime(2014, 7, 4, 15),
- ),
- datetime(2014, 7, 7, 9, 1): (
- datetime(2014, 7, 7, 11, 15),
- datetime(2014, 7, 4, 15),
- ),
- datetime(2014, 7, 7, 12): (
- datetime(2014, 7, 7, 15),
- datetime(2014, 7, 7, 11, 15),
- ),
- },
- ),
- (
- [
- BusinessHour(n=-1, start=["17:00", "08:00"], end=["05:00", "10:00"]),
- BusinessHour(n=-2, start=["08:00", "17:00"], end=["10:00", "03:00"]),
- ],
- {
- datetime(2014, 7, 1, 11): (
- datetime(2014, 7, 1, 8),
- datetime(2014, 7, 1, 17),
- ),
- datetime(2014, 7, 1, 18): (
- datetime(2014, 7, 1, 17),
- datetime(2014, 7, 2, 8),
- ),
- datetime(2014, 7, 1, 23): (
- datetime(2014, 7, 1, 17),
- datetime(2014, 7, 2, 8),
- ),
- datetime(2014, 7, 2, 8): (
- datetime(2014, 7, 2, 8),
- datetime(2014, 7, 2, 8),
- ),
- datetime(2014, 7, 2, 9): (
- datetime(2014, 7, 2, 8),
- datetime(2014, 7, 2, 17),
- ),
- datetime(2014, 7, 2, 16, 59): (
- datetime(2014, 7, 2, 8),
- datetime(2014, 7, 2, 17),
- ),
- datetime(2014, 7, 5, 10): (
- datetime(2014, 7, 4, 17),
- datetime(2014, 7, 7, 8),
- ),
- datetime(2014, 7, 4, 10): (
- datetime(2014, 7, 4, 8),
- datetime(2014, 7, 4, 17),
- ),
- datetime(2014, 7, 4, 23): (
- datetime(2014, 7, 4, 17),
- datetime(2014, 7, 7, 8),
- ),
- datetime(2014, 7, 6, 10): (
- datetime(2014, 7, 4, 17),
- datetime(2014, 7, 7, 8),
- ),
- datetime(2014, 7, 7, 5): (
- datetime(2014, 7, 4, 17),
- datetime(2014, 7, 7, 8),
- ),
- datetime(2014, 7, 7, 18): (
- datetime(2014, 7, 7, 17),
- datetime(2014, 7, 8, 8),
- ),
- },
- ),
- ]
- @pytest.mark.parametrize("case", opening_time_cases)
- def test_opening_time(self, case):
- _offsets, cases = case
- for offset in _offsets:
- for dt, (exp_next, exp_prev) in cases.items():
- assert offset._next_opening_time(dt) == exp_next
- assert offset._prev_opening_time(dt) == exp_prev
|