221 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			221 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""
 | 
						|
Tests for the following offsets:
 | 
						|
- BMonthBegin
 | 
						|
- BMonthEnd
 | 
						|
"""
 | 
						|
from datetime import datetime
 | 
						|
 | 
						|
import pytest
 | 
						|
 | 
						|
import pandas as pd
 | 
						|
from pandas.tests.tseries.offsets.common import (
 | 
						|
    Base,
 | 
						|
    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(Base):
 | 
						|
    _offset = BMonthBegin
 | 
						|
 | 
						|
    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(Base):
 | 
						|
    _offset = BMonthEnd
 | 
						|
 | 
						|
    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)
 |