123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- """
- Tests for the following offsets:
- - BMonthBegin
- - BMonthEnd
- """
- from __future__ import annotations
- from datetime import datetime
- import pytest
- import pandas as pd
- from pandas.tests.tseries.offsets.common import (
- assert_is_on_offset,
- assert_offset_equal,
- )
- from pandas.tseries.offsets import (
- BMonthBegin,
- BMonthEnd,
- )
- @pytest.mark.parametrize("n", [-2, 1])
- @pytest.mark.parametrize(
- "cls",
- [
- BMonthBegin,
- BMonthEnd,
- ],
- )
- def test_apply_index(cls, n):
- offset = cls(n=n)
- rng = pd.date_range(start="1/1/2000", periods=100000, freq="T")
- ser = pd.Series(rng)
- res = rng + offset
- assert res.freq is None # not retained
- assert res[0] == rng[0] + offset
- assert res[-1] == rng[-1] + offset
- res2 = ser + offset
- # apply_index is only for indexes, not series, so no res2_v2
- assert res2.iloc[0] == ser.iloc[0] + offset
- assert res2.iloc[-1] == ser.iloc[-1] + offset
- class TestBMonthBegin:
- def test_offsets_compare_equal(self):
- # root cause of #456
- offset1 = BMonthBegin()
- offset2 = BMonthBegin()
- assert not offset1 != offset2
- offset_cases = []
- offset_cases.append(
- (
- BMonthBegin(),
- {
- datetime(2008, 1, 1): datetime(2008, 2, 1),
- datetime(2008, 1, 31): datetime(2008, 2, 1),
- datetime(2006, 12, 29): datetime(2007, 1, 1),
- datetime(2006, 12, 31): datetime(2007, 1, 1),
- datetime(2006, 9, 1): datetime(2006, 10, 2),
- datetime(2007, 1, 1): datetime(2007, 2, 1),
- datetime(2006, 12, 1): datetime(2007, 1, 1),
- },
- )
- )
- offset_cases.append(
- (
- BMonthBegin(0),
- {
- datetime(2008, 1, 1): datetime(2008, 1, 1),
- datetime(2006, 10, 2): datetime(2006, 10, 2),
- datetime(2008, 1, 31): datetime(2008, 2, 1),
- datetime(2006, 12, 29): datetime(2007, 1, 1),
- datetime(2006, 12, 31): datetime(2007, 1, 1),
- datetime(2006, 9, 15): datetime(2006, 10, 2),
- },
- )
- )
- offset_cases.append(
- (
- BMonthBegin(2),
- {
- datetime(2008, 1, 1): datetime(2008, 3, 3),
- datetime(2008, 1, 15): datetime(2008, 3, 3),
- datetime(2006, 12, 29): datetime(2007, 2, 1),
- datetime(2006, 12, 31): datetime(2007, 2, 1),
- datetime(2007, 1, 1): datetime(2007, 3, 1),
- datetime(2006, 11, 1): datetime(2007, 1, 1),
- },
- )
- )
- offset_cases.append(
- (
- BMonthBegin(-1),
- {
- datetime(2007, 1, 1): datetime(2006, 12, 1),
- datetime(2008, 6, 30): datetime(2008, 6, 2),
- datetime(2008, 6, 1): datetime(2008, 5, 1),
- datetime(2008, 3, 10): datetime(2008, 3, 3),
- datetime(2008, 12, 31): datetime(2008, 12, 1),
- datetime(2006, 12, 29): datetime(2006, 12, 1),
- datetime(2006, 12, 30): datetime(2006, 12, 1),
- datetime(2007, 1, 1): datetime(2006, 12, 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)
- on_offset_cases = [
- (BMonthBegin(), datetime(2007, 12, 31), False),
- (BMonthBegin(), datetime(2008, 1, 1), True),
- (BMonthBegin(), datetime(2001, 4, 2), True),
- (BMonthBegin(), datetime(2008, 3, 3), 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 TestBMonthEnd:
- def test_normalize(self):
- dt = datetime(2007, 1, 1, 3)
- result = dt + BMonthEnd(normalize=True)
- expected = dt.replace(hour=0) + BMonthEnd()
- assert result == expected
- def test_offsets_compare_equal(self):
- # root cause of #456
- offset1 = BMonthEnd()
- offset2 = BMonthEnd()
- assert not offset1 != offset2
- offset_cases = []
- offset_cases.append(
- (
- BMonthEnd(),
- {
- datetime(2008, 1, 1): datetime(2008, 1, 31),
- datetime(2008, 1, 31): datetime(2008, 2, 29),
- datetime(2006, 12, 29): datetime(2007, 1, 31),
- datetime(2006, 12, 31): datetime(2007, 1, 31),
- datetime(2007, 1, 1): datetime(2007, 1, 31),
- datetime(2006, 12, 1): datetime(2006, 12, 29),
- },
- )
- )
- offset_cases.append(
- (
- BMonthEnd(0),
- {
- datetime(2008, 1, 1): datetime(2008, 1, 31),
- datetime(2008, 1, 31): datetime(2008, 1, 31),
- datetime(2006, 12, 29): datetime(2006, 12, 29),
- datetime(2006, 12, 31): datetime(2007, 1, 31),
- datetime(2007, 1, 1): datetime(2007, 1, 31),
- },
- )
- )
- offset_cases.append(
- (
- BMonthEnd(2),
- {
- datetime(2008, 1, 1): datetime(2008, 2, 29),
- datetime(2008, 1, 31): datetime(2008, 3, 31),
- datetime(2006, 12, 29): datetime(2007, 2, 28),
- datetime(2006, 12, 31): datetime(2007, 2, 28),
- datetime(2007, 1, 1): datetime(2007, 2, 28),
- datetime(2006, 11, 1): datetime(2006, 12, 29),
- },
- )
- )
- offset_cases.append(
- (
- BMonthEnd(-1),
- {
- datetime(2007, 1, 1): datetime(2006, 12, 29),
- datetime(2008, 6, 30): datetime(2008, 5, 30),
- datetime(2008, 12, 31): datetime(2008, 11, 28),
- datetime(2006, 12, 29): datetime(2006, 11, 30),
- datetime(2006, 12, 30): datetime(2006, 12, 29),
- datetime(2007, 1, 1): 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 = [
- (BMonthEnd(), datetime(2007, 12, 31), True),
- (BMonthEnd(), datetime(2008, 1, 1), 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)
|