123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- """
- Tests for the following offsets:
- - BYearBegin
- - BYearEnd
- """
- from __future__ import annotations
- from datetime import datetime
- import pytest
- from pandas.tests.tseries.offsets.common import (
- assert_is_on_offset,
- assert_offset_equal,
- )
- from pandas.tseries.offsets import (
- BYearBegin,
- BYearEnd,
- )
- class TestBYearBegin:
- def test_misspecified(self):
- msg = "Month must go from 1 to 12"
- with pytest.raises(ValueError, match=msg):
- BYearBegin(month=13)
- with pytest.raises(ValueError, match=msg):
- BYearEnd(month=13)
- offset_cases = []
- offset_cases.append(
- (
- BYearBegin(),
- {
- datetime(2008, 1, 1): datetime(2009, 1, 1),
- datetime(2008, 6, 30): datetime(2009, 1, 1),
- datetime(2008, 12, 31): datetime(2009, 1, 1),
- datetime(2011, 1, 1): datetime(2011, 1, 3),
- datetime(2011, 1, 3): datetime(2012, 1, 2),
- datetime(2005, 12, 30): datetime(2006, 1, 2),
- datetime(2005, 12, 31): datetime(2006, 1, 2),
- },
- )
- )
- offset_cases.append(
- (
- BYearBegin(0),
- {
- datetime(2008, 1, 1): datetime(2008, 1, 1),
- datetime(2008, 6, 30): datetime(2009, 1, 1),
- datetime(2008, 12, 31): datetime(2009, 1, 1),
- datetime(2005, 12, 30): datetime(2006, 1, 2),
- datetime(2005, 12, 31): datetime(2006, 1, 2),
- },
- )
- )
- offset_cases.append(
- (
- BYearBegin(-1),
- {
- datetime(2007, 1, 1): datetime(2006, 1, 2),
- datetime(2009, 1, 4): datetime(2009, 1, 1),
- datetime(2009, 1, 1): datetime(2008, 1, 1),
- datetime(2008, 6, 30): datetime(2008, 1, 1),
- datetime(2008, 12, 31): datetime(2008, 1, 1),
- datetime(2006, 12, 29): datetime(2006, 1, 2),
- datetime(2006, 12, 30): datetime(2006, 1, 2),
- datetime(2006, 1, 1): datetime(2005, 1, 3),
- },
- )
- )
- offset_cases.append(
- (
- BYearBegin(-2),
- {
- datetime(2007, 1, 1): datetime(2005, 1, 3),
- datetime(2007, 6, 30): datetime(2006, 1, 2),
- datetime(2008, 12, 31): datetime(2007, 1, 1),
- },
- )
- )
- @pytest.mark.parametrize("case", offset_cases)
- def test_offset(self, case):
- offset, cases = case
- for base, expected in cases.items():
- assert_offset_equal(offset, base, expected)
- class TestBYearEnd:
- offset_cases = []
- offset_cases.append(
- (
- BYearEnd(),
- {
- datetime(2008, 1, 1): datetime(2008, 12, 31),
- datetime(2008, 6, 30): datetime(2008, 12, 31),
- datetime(2008, 12, 31): datetime(2009, 12, 31),
- datetime(2005, 12, 30): datetime(2006, 12, 29),
- datetime(2005, 12, 31): datetime(2006, 12, 29),
- },
- )
- )
- offset_cases.append(
- (
- BYearEnd(0),
- {
- datetime(2008, 1, 1): datetime(2008, 12, 31),
- datetime(2008, 6, 30): datetime(2008, 12, 31),
- datetime(2008, 12, 31): datetime(2008, 12, 31),
- datetime(2005, 12, 31): datetime(2006, 12, 29),
- },
- )
- )
- offset_cases.append(
- (
- BYearEnd(-1),
- {
- datetime(2007, 1, 1): datetime(2006, 12, 29),
- datetime(2008, 6, 30): datetime(2007, 12, 31),
- datetime(2008, 12, 31): datetime(2007, 12, 31),
- datetime(2006, 12, 29): datetime(2005, 12, 30),
- datetime(2006, 12, 30): datetime(2006, 12, 29),
- datetime(2007, 1, 1): datetime(2006, 12, 29),
- },
- )
- )
- offset_cases.append(
- (
- BYearEnd(-2),
- {
- datetime(2007, 1, 1): datetime(2005, 12, 30),
- datetime(2008, 6, 30): datetime(2006, 12, 29),
- datetime(2008, 12, 31): datetime(2006, 12, 29),
- },
- )
- )
- @pytest.mark.parametrize("case", offset_cases)
- def test_offset(self, case):
- offset, cases = case
- for base, expected in cases.items():
- assert_offset_equal(offset, base, expected)
- on_offset_cases = [
- (BYearEnd(), datetime(2007, 12, 31), True),
- (BYearEnd(), datetime(2008, 1, 1), False),
- (BYearEnd(), datetime(2006, 12, 31), False),
- (BYearEnd(), datetime(2006, 12, 29), True),
- ]
- @pytest.mark.parametrize("case", on_offset_cases)
- def test_is_on_offset(self, case):
- offset, dt, expected = case
- assert_is_on_offset(offset, dt, expected)
- class TestBYearEndLagged:
- def test_bad_month_fail(self):
- msg = "Month must go from 1 to 12"
- with pytest.raises(ValueError, match=msg):
- BYearEnd(month=13)
- with pytest.raises(ValueError, match=msg):
- BYearEnd(month=0)
- offset_cases = []
- offset_cases.append(
- (
- BYearEnd(month=6),
- {
- datetime(2008, 1, 1): datetime(2008, 6, 30),
- datetime(2007, 6, 30): datetime(2008, 6, 30),
- },
- )
- )
- offset_cases.append(
- (
- BYearEnd(n=-1, month=6),
- {
- datetime(2008, 1, 1): datetime(2007, 6, 29),
- datetime(2007, 6, 30): datetime(2007, 6, 29),
- },
- )
- )
- @pytest.mark.parametrize("case", offset_cases)
- def test_offset(self, case):
- offset, cases = case
- for base, expected in cases.items():
- assert_offset_equal(offset, base, expected)
- def test_roll(self):
- offset = BYearEnd(month=6)
- date = datetime(2009, 11, 30)
- assert offset.rollforward(date) == datetime(2010, 6, 30)
- assert offset.rollback(date) == datetime(2009, 6, 30)
- on_offset_cases = [
- (BYearEnd(month=2), datetime(2007, 2, 28), True),
- (BYearEnd(month=6), datetime(2007, 6, 30), False),
- ]
- @pytest.mark.parametrize("case", on_offset_cases)
- def test_is_on_offset(self, case):
- offset, dt, expected = case
- assert_is_on_offset(offset, dt, expected)
|