699 lines
27 KiB
Python
699 lines
27 KiB
Python
"""
|
|
Tests for Fiscal Year and Fiscal Quarter offset classes
|
|
"""
|
|
from datetime import datetime
|
|
|
|
from dateutil.relativedelta import relativedelta
|
|
import pytest
|
|
|
|
from pandas._libs.tslibs.period import INVALID_FREQ_ERR_MSG
|
|
|
|
from pandas import Timestamp
|
|
import pandas._testing as tm
|
|
from pandas.tests.tseries.offsets.common import (
|
|
Base,
|
|
WeekDay,
|
|
assert_is_on_offset,
|
|
assert_offset_equal,
|
|
)
|
|
|
|
from pandas.tseries.frequencies import get_offset
|
|
from pandas.tseries.offsets import (
|
|
FY5253,
|
|
FY5253Quarter,
|
|
)
|
|
|
|
|
|
def makeFY5253LastOfMonthQuarter(*args, **kwds):
|
|
return FY5253Quarter(*args, variation="last", **kwds)
|
|
|
|
|
|
def makeFY5253NearestEndMonthQuarter(*args, **kwds):
|
|
return FY5253Quarter(*args, variation="nearest", **kwds)
|
|
|
|
|
|
def makeFY5253NearestEndMonth(*args, **kwds):
|
|
return FY5253(*args, variation="nearest", **kwds)
|
|
|
|
|
|
def makeFY5253LastOfMonth(*args, **kwds):
|
|
return FY5253(*args, variation="last", **kwds)
|
|
|
|
|
|
def test_get_offset_name():
|
|
assert (
|
|
makeFY5253LastOfMonthQuarter(
|
|
weekday=1, startingMonth=3, qtr_with_extra_week=4
|
|
).freqstr
|
|
== "REQ-L-MAR-TUE-4"
|
|
)
|
|
assert (
|
|
makeFY5253NearestEndMonthQuarter(
|
|
weekday=1, startingMonth=3, qtr_with_extra_week=3
|
|
).freqstr
|
|
== "REQ-N-MAR-TUE-3"
|
|
)
|
|
|
|
|
|
def test_get_offset():
|
|
with pytest.raises(ValueError, match=INVALID_FREQ_ERR_MSG):
|
|
with tm.assert_produces_warning(FutureWarning):
|
|
get_offset("gibberish")
|
|
with pytest.raises(ValueError, match=INVALID_FREQ_ERR_MSG):
|
|
with tm.assert_produces_warning(FutureWarning):
|
|
get_offset("QS-JAN-B")
|
|
|
|
pairs = [
|
|
("RE-N-DEC-MON", makeFY5253NearestEndMonth(weekday=0, startingMonth=12)),
|
|
("RE-L-DEC-TUE", makeFY5253LastOfMonth(weekday=1, startingMonth=12)),
|
|
(
|
|
"REQ-L-MAR-TUE-4",
|
|
makeFY5253LastOfMonthQuarter(
|
|
weekday=1, startingMonth=3, qtr_with_extra_week=4
|
|
),
|
|
),
|
|
(
|
|
"REQ-L-DEC-MON-3",
|
|
makeFY5253LastOfMonthQuarter(
|
|
weekday=0, startingMonth=12, qtr_with_extra_week=3
|
|
),
|
|
),
|
|
(
|
|
"REQ-N-DEC-MON-3",
|
|
makeFY5253NearestEndMonthQuarter(
|
|
weekday=0, startingMonth=12, qtr_with_extra_week=3
|
|
),
|
|
),
|
|
]
|
|
|
|
for name, expected in pairs:
|
|
with tm.assert_produces_warning(FutureWarning):
|
|
offset = get_offset(name)
|
|
assert offset == expected, (
|
|
f"Expected {repr(name)} to yield {repr(expected)} "
|
|
f"(actual: {repr(offset)})"
|
|
)
|
|
|
|
|
|
class TestFY5253LastOfMonth(Base):
|
|
offset_lom_sat_aug = makeFY5253LastOfMonth(1, startingMonth=8, weekday=WeekDay.SAT)
|
|
offset_lom_sat_sep = makeFY5253LastOfMonth(1, startingMonth=9, weekday=WeekDay.SAT)
|
|
|
|
on_offset_cases = [
|
|
# From Wikipedia (see:
|
|
# https://en.wikipedia.org/wiki/4%E2%80%934%E2%80%935_calendar#Last_Saturday_of_the_month_at_fiscal_year_end)
|
|
(offset_lom_sat_aug, datetime(2006, 8, 26), True),
|
|
(offset_lom_sat_aug, datetime(2007, 8, 25), True),
|
|
(offset_lom_sat_aug, datetime(2008, 8, 30), True),
|
|
(offset_lom_sat_aug, datetime(2009, 8, 29), True),
|
|
(offset_lom_sat_aug, datetime(2010, 8, 28), True),
|
|
(offset_lom_sat_aug, datetime(2011, 8, 27), True),
|
|
(offset_lom_sat_aug, datetime(2012, 8, 25), True),
|
|
(offset_lom_sat_aug, datetime(2013, 8, 31), True),
|
|
(offset_lom_sat_aug, datetime(2014, 8, 30), True),
|
|
(offset_lom_sat_aug, datetime(2015, 8, 29), True),
|
|
(offset_lom_sat_aug, datetime(2016, 8, 27), True),
|
|
(offset_lom_sat_aug, datetime(2017, 8, 26), True),
|
|
(offset_lom_sat_aug, datetime(2018, 8, 25), True),
|
|
(offset_lom_sat_aug, datetime(2019, 8, 31), True),
|
|
(offset_lom_sat_aug, datetime(2006, 8, 27), False),
|
|
(offset_lom_sat_aug, datetime(2007, 8, 28), False),
|
|
(offset_lom_sat_aug, datetime(2008, 8, 31), False),
|
|
(offset_lom_sat_aug, datetime(2009, 8, 30), False),
|
|
(offset_lom_sat_aug, datetime(2010, 8, 29), False),
|
|
(offset_lom_sat_aug, datetime(2011, 8, 28), False),
|
|
(offset_lom_sat_aug, datetime(2006, 8, 25), False),
|
|
(offset_lom_sat_aug, datetime(2007, 8, 24), False),
|
|
(offset_lom_sat_aug, datetime(2008, 8, 29), False),
|
|
(offset_lom_sat_aug, datetime(2009, 8, 28), False),
|
|
(offset_lom_sat_aug, datetime(2010, 8, 27), False),
|
|
(offset_lom_sat_aug, datetime(2011, 8, 26), False),
|
|
(offset_lom_sat_aug, datetime(2019, 8, 30), False),
|
|
# From GMCR (see for example:
|
|
# http://yahoo.brand.edgar-online.com/Default.aspx?
|
|
# companyid=3184&formtypeID=7)
|
|
(offset_lom_sat_sep, datetime(2010, 9, 25), True),
|
|
(offset_lom_sat_sep, datetime(2011, 9, 24), True),
|
|
(offset_lom_sat_sep, datetime(2012, 9, 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)
|
|
|
|
def test_apply(self):
|
|
offset_lom_aug_sat = makeFY5253LastOfMonth(startingMonth=8, weekday=WeekDay.SAT)
|
|
offset_lom_aug_sat_1 = makeFY5253LastOfMonth(
|
|
n=1, startingMonth=8, weekday=WeekDay.SAT
|
|
)
|
|
|
|
date_seq_lom_aug_sat = [
|
|
datetime(2006, 8, 26),
|
|
datetime(2007, 8, 25),
|
|
datetime(2008, 8, 30),
|
|
datetime(2009, 8, 29),
|
|
datetime(2010, 8, 28),
|
|
datetime(2011, 8, 27),
|
|
datetime(2012, 8, 25),
|
|
datetime(2013, 8, 31),
|
|
datetime(2014, 8, 30),
|
|
datetime(2015, 8, 29),
|
|
datetime(2016, 8, 27),
|
|
]
|
|
|
|
tests = [
|
|
(offset_lom_aug_sat, date_seq_lom_aug_sat),
|
|
(offset_lom_aug_sat_1, date_seq_lom_aug_sat),
|
|
(offset_lom_aug_sat, [datetime(2006, 8, 25)] + date_seq_lom_aug_sat),
|
|
(offset_lom_aug_sat_1, [datetime(2006, 8, 27)] + date_seq_lom_aug_sat[1:]),
|
|
(
|
|
makeFY5253LastOfMonth(n=-1, startingMonth=8, weekday=WeekDay.SAT),
|
|
list(reversed(date_seq_lom_aug_sat)),
|
|
),
|
|
]
|
|
for test in tests:
|
|
offset, data = test
|
|
current = data[0]
|
|
for datum in data[1:]:
|
|
current = current + offset
|
|
assert current == datum
|
|
|
|
|
|
class TestFY5253NearestEndMonth(Base):
|
|
def test_get_year_end(self):
|
|
assert makeFY5253NearestEndMonth(
|
|
startingMonth=8, weekday=WeekDay.SAT
|
|
).get_year_end(datetime(2013, 1, 1)) == datetime(2013, 8, 31)
|
|
assert makeFY5253NearestEndMonth(
|
|
startingMonth=8, weekday=WeekDay.SUN
|
|
).get_year_end(datetime(2013, 1, 1)) == datetime(2013, 9, 1)
|
|
assert makeFY5253NearestEndMonth(
|
|
startingMonth=8, weekday=WeekDay.FRI
|
|
).get_year_end(datetime(2013, 1, 1)) == datetime(2013, 8, 30)
|
|
|
|
offset_n = FY5253(weekday=WeekDay.TUE, startingMonth=12, variation="nearest")
|
|
assert offset_n.get_year_end(datetime(2012, 1, 1)) == datetime(2013, 1, 1)
|
|
assert offset_n.get_year_end(datetime(2012, 1, 10)) == datetime(2013, 1, 1)
|
|
|
|
assert offset_n.get_year_end(datetime(2013, 1, 1)) == datetime(2013, 12, 31)
|
|
assert offset_n.get_year_end(datetime(2013, 1, 2)) == datetime(2013, 12, 31)
|
|
assert offset_n.get_year_end(datetime(2013, 1, 3)) == datetime(2013, 12, 31)
|
|
assert offset_n.get_year_end(datetime(2013, 1, 10)) == datetime(2013, 12, 31)
|
|
|
|
JNJ = FY5253(n=1, startingMonth=12, weekday=6, variation="nearest")
|
|
assert JNJ.get_year_end(datetime(2006, 1, 1)) == datetime(2006, 12, 31)
|
|
|
|
offset_lom_aug_sat = makeFY5253NearestEndMonth(
|
|
1, startingMonth=8, weekday=WeekDay.SAT
|
|
)
|
|
offset_lom_aug_thu = makeFY5253NearestEndMonth(
|
|
1, startingMonth=8, weekday=WeekDay.THU
|
|
)
|
|
offset_n = FY5253(weekday=WeekDay.TUE, startingMonth=12, variation="nearest")
|
|
|
|
on_offset_cases = [
|
|
# From Wikipedia (see:
|
|
# https://en.wikipedia.org/wiki/4%E2%80%934%E2%80%935_calendar
|
|
# #Saturday_nearest_the_end_of_month)
|
|
# 2006-09-02 2006 September 2
|
|
# 2007-09-01 2007 September 1
|
|
# 2008-08-30 2008 August 30 (leap year)
|
|
# 2009-08-29 2009 August 29
|
|
# 2010-08-28 2010 August 28
|
|
# 2011-09-03 2011 September 3
|
|
# 2012-09-01 2012 September 1 (leap year)
|
|
# 2013-08-31 2013 August 31
|
|
# 2014-08-30 2014 August 30
|
|
# 2015-08-29 2015 August 29
|
|
# 2016-09-03 2016 September 3 (leap year)
|
|
# 2017-09-02 2017 September 2
|
|
# 2018-09-01 2018 September 1
|
|
# 2019-08-31 2019 August 31
|
|
(offset_lom_aug_sat, datetime(2006, 9, 2), True),
|
|
(offset_lom_aug_sat, datetime(2007, 9, 1), True),
|
|
(offset_lom_aug_sat, datetime(2008, 8, 30), True),
|
|
(offset_lom_aug_sat, datetime(2009, 8, 29), True),
|
|
(offset_lom_aug_sat, datetime(2010, 8, 28), True),
|
|
(offset_lom_aug_sat, datetime(2011, 9, 3), True),
|
|
(offset_lom_aug_sat, datetime(2016, 9, 3), True),
|
|
(offset_lom_aug_sat, datetime(2017, 9, 2), True),
|
|
(offset_lom_aug_sat, datetime(2018, 9, 1), True),
|
|
(offset_lom_aug_sat, datetime(2019, 8, 31), True),
|
|
(offset_lom_aug_sat, datetime(2006, 8, 27), False),
|
|
(offset_lom_aug_sat, datetime(2007, 8, 28), False),
|
|
(offset_lom_aug_sat, datetime(2008, 8, 31), False),
|
|
(offset_lom_aug_sat, datetime(2009, 8, 30), False),
|
|
(offset_lom_aug_sat, datetime(2010, 8, 29), False),
|
|
(offset_lom_aug_sat, datetime(2011, 8, 28), False),
|
|
(offset_lom_aug_sat, datetime(2006, 8, 25), False),
|
|
(offset_lom_aug_sat, datetime(2007, 8, 24), False),
|
|
(offset_lom_aug_sat, datetime(2008, 8, 29), False),
|
|
(offset_lom_aug_sat, datetime(2009, 8, 28), False),
|
|
(offset_lom_aug_sat, datetime(2010, 8, 27), False),
|
|
(offset_lom_aug_sat, datetime(2011, 8, 26), False),
|
|
(offset_lom_aug_sat, datetime(2019, 8, 30), False),
|
|
# From Micron, see:
|
|
# http://google.brand.edgar-online.com/?sym=MU&formtypeID=7
|
|
(offset_lom_aug_thu, datetime(2012, 8, 30), True),
|
|
(offset_lom_aug_thu, datetime(2011, 9, 1), True),
|
|
(offset_n, datetime(2012, 12, 31), False),
|
|
(offset_n, datetime(2013, 1, 1), True),
|
|
(offset_n, datetime(2013, 1, 2), 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)
|
|
|
|
def test_apply(self):
|
|
date_seq_nem_8_sat = [
|
|
datetime(2006, 9, 2),
|
|
datetime(2007, 9, 1),
|
|
datetime(2008, 8, 30),
|
|
datetime(2009, 8, 29),
|
|
datetime(2010, 8, 28),
|
|
datetime(2011, 9, 3),
|
|
]
|
|
|
|
JNJ = [
|
|
datetime(2005, 1, 2),
|
|
datetime(2006, 1, 1),
|
|
datetime(2006, 12, 31),
|
|
datetime(2007, 12, 30),
|
|
datetime(2008, 12, 28),
|
|
datetime(2010, 1, 3),
|
|
datetime(2011, 1, 2),
|
|
datetime(2012, 1, 1),
|
|
datetime(2012, 12, 30),
|
|
]
|
|
|
|
DEC_SAT = FY5253(n=-1, startingMonth=12, weekday=5, variation="nearest")
|
|
|
|
tests = [
|
|
(
|
|
makeFY5253NearestEndMonth(startingMonth=8, weekday=WeekDay.SAT),
|
|
date_seq_nem_8_sat,
|
|
),
|
|
(
|
|
makeFY5253NearestEndMonth(n=1, startingMonth=8, weekday=WeekDay.SAT),
|
|
date_seq_nem_8_sat,
|
|
),
|
|
(
|
|
makeFY5253NearestEndMonth(startingMonth=8, weekday=WeekDay.SAT),
|
|
[datetime(2006, 9, 1)] + date_seq_nem_8_sat,
|
|
),
|
|
(
|
|
makeFY5253NearestEndMonth(n=1, startingMonth=8, weekday=WeekDay.SAT),
|
|
[datetime(2006, 9, 3)] + date_seq_nem_8_sat[1:],
|
|
),
|
|
(
|
|
makeFY5253NearestEndMonth(n=-1, startingMonth=8, weekday=WeekDay.SAT),
|
|
list(reversed(date_seq_nem_8_sat)),
|
|
),
|
|
(
|
|
makeFY5253NearestEndMonth(n=1, startingMonth=12, weekday=WeekDay.SUN),
|
|
JNJ,
|
|
),
|
|
(
|
|
makeFY5253NearestEndMonth(n=-1, startingMonth=12, weekday=WeekDay.SUN),
|
|
list(reversed(JNJ)),
|
|
),
|
|
(
|
|
makeFY5253NearestEndMonth(n=1, startingMonth=12, weekday=WeekDay.SUN),
|
|
[datetime(2005, 1, 2), datetime(2006, 1, 1)],
|
|
),
|
|
(
|
|
makeFY5253NearestEndMonth(n=1, startingMonth=12, weekday=WeekDay.SUN),
|
|
[datetime(2006, 1, 2), datetime(2006, 12, 31)],
|
|
),
|
|
(DEC_SAT, [datetime(2013, 1, 15), datetime(2012, 12, 29)]),
|
|
]
|
|
for test in tests:
|
|
offset, data = test
|
|
current = data[0]
|
|
for datum in data[1:]:
|
|
current = current + offset
|
|
assert current == datum
|
|
|
|
|
|
class TestFY5253LastOfMonthQuarter(Base):
|
|
def test_is_anchored(self):
|
|
assert makeFY5253LastOfMonthQuarter(
|
|
startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
).is_anchored()
|
|
assert makeFY5253LastOfMonthQuarter(
|
|
weekday=WeekDay.SAT, startingMonth=3, qtr_with_extra_week=4
|
|
).is_anchored()
|
|
assert not makeFY5253LastOfMonthQuarter(
|
|
2, startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
).is_anchored()
|
|
|
|
def test_equality(self):
|
|
assert makeFY5253LastOfMonthQuarter(
|
|
startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
) == makeFY5253LastOfMonthQuarter(
|
|
startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
)
|
|
assert makeFY5253LastOfMonthQuarter(
|
|
startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
) != makeFY5253LastOfMonthQuarter(
|
|
startingMonth=1, weekday=WeekDay.SUN, qtr_with_extra_week=4
|
|
)
|
|
assert makeFY5253LastOfMonthQuarter(
|
|
startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
) != makeFY5253LastOfMonthQuarter(
|
|
startingMonth=2, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
)
|
|
|
|
def test_offset(self):
|
|
offset = makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
)
|
|
offset2 = makeFY5253LastOfMonthQuarter(
|
|
2, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
)
|
|
offset4 = makeFY5253LastOfMonthQuarter(
|
|
4, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
)
|
|
|
|
offset_neg1 = makeFY5253LastOfMonthQuarter(
|
|
-1, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
)
|
|
offset_neg2 = makeFY5253LastOfMonthQuarter(
|
|
-2, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
)
|
|
|
|
GMCR = [
|
|
datetime(2010, 3, 27),
|
|
datetime(2010, 6, 26),
|
|
datetime(2010, 9, 25),
|
|
datetime(2010, 12, 25),
|
|
datetime(2011, 3, 26),
|
|
datetime(2011, 6, 25),
|
|
datetime(2011, 9, 24),
|
|
datetime(2011, 12, 24),
|
|
datetime(2012, 3, 24),
|
|
datetime(2012, 6, 23),
|
|
datetime(2012, 9, 29),
|
|
datetime(2012, 12, 29),
|
|
datetime(2013, 3, 30),
|
|
datetime(2013, 6, 29),
|
|
]
|
|
|
|
assert_offset_equal(offset, base=GMCR[0], expected=GMCR[1])
|
|
assert_offset_equal(
|
|
offset, base=GMCR[0] + relativedelta(days=-1), expected=GMCR[0]
|
|
)
|
|
assert_offset_equal(offset, base=GMCR[1], expected=GMCR[2])
|
|
|
|
assert_offset_equal(offset2, base=GMCR[0], expected=GMCR[2])
|
|
assert_offset_equal(offset4, base=GMCR[0], expected=GMCR[4])
|
|
|
|
assert_offset_equal(offset_neg1, base=GMCR[-1], expected=GMCR[-2])
|
|
assert_offset_equal(
|
|
offset_neg1, base=GMCR[-1] + relativedelta(days=+1), expected=GMCR[-1]
|
|
)
|
|
assert_offset_equal(offset_neg2, base=GMCR[-1], expected=GMCR[-3])
|
|
|
|
date = GMCR[0] + relativedelta(days=-1)
|
|
for expected in GMCR:
|
|
assert_offset_equal(offset, date, expected)
|
|
date = date + offset
|
|
|
|
date = GMCR[-1] + relativedelta(days=+1)
|
|
for expected in reversed(GMCR):
|
|
assert_offset_equal(offset_neg1, date, expected)
|
|
date = date + offset_neg1
|
|
|
|
lomq_aug_sat_4 = makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=8, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
)
|
|
lomq_sep_sat_4 = makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
)
|
|
|
|
on_offset_cases = [
|
|
# From Wikipedia
|
|
(lomq_aug_sat_4, datetime(2006, 8, 26), True),
|
|
(lomq_aug_sat_4, datetime(2007, 8, 25), True),
|
|
(lomq_aug_sat_4, datetime(2008, 8, 30), True),
|
|
(lomq_aug_sat_4, datetime(2009, 8, 29), True),
|
|
(lomq_aug_sat_4, datetime(2010, 8, 28), True),
|
|
(lomq_aug_sat_4, datetime(2011, 8, 27), True),
|
|
(lomq_aug_sat_4, datetime(2019, 8, 31), True),
|
|
(lomq_aug_sat_4, datetime(2006, 8, 27), False),
|
|
(lomq_aug_sat_4, datetime(2007, 8, 28), False),
|
|
(lomq_aug_sat_4, datetime(2008, 8, 31), False),
|
|
(lomq_aug_sat_4, datetime(2009, 8, 30), False),
|
|
(lomq_aug_sat_4, datetime(2010, 8, 29), False),
|
|
(lomq_aug_sat_4, datetime(2011, 8, 28), False),
|
|
(lomq_aug_sat_4, datetime(2006, 8, 25), False),
|
|
(lomq_aug_sat_4, datetime(2007, 8, 24), False),
|
|
(lomq_aug_sat_4, datetime(2008, 8, 29), False),
|
|
(lomq_aug_sat_4, datetime(2009, 8, 28), False),
|
|
(lomq_aug_sat_4, datetime(2010, 8, 27), False),
|
|
(lomq_aug_sat_4, datetime(2011, 8, 26), False),
|
|
(lomq_aug_sat_4, datetime(2019, 8, 30), False),
|
|
# From GMCR
|
|
(lomq_sep_sat_4, datetime(2010, 9, 25), True),
|
|
(lomq_sep_sat_4, datetime(2011, 9, 24), True),
|
|
(lomq_sep_sat_4, datetime(2012, 9, 29), True),
|
|
(lomq_sep_sat_4, datetime(2013, 6, 29), True),
|
|
(lomq_sep_sat_4, datetime(2012, 6, 23), True),
|
|
(lomq_sep_sat_4, datetime(2012, 6, 30), False),
|
|
(lomq_sep_sat_4, datetime(2013, 3, 30), True),
|
|
(lomq_sep_sat_4, datetime(2012, 3, 24), True),
|
|
(lomq_sep_sat_4, datetime(2012, 12, 29), True),
|
|
(lomq_sep_sat_4, datetime(2011, 12, 24), True),
|
|
# INTC (extra week in Q1)
|
|
# See: http://www.intc.com/releasedetail.cfm?ReleaseID=542844
|
|
(
|
|
makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
|
|
),
|
|
datetime(2011, 4, 2),
|
|
True,
|
|
),
|
|
# see: http://google.brand.edgar-online.com/?sym=INTC&formtypeID=7
|
|
(
|
|
makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
|
|
),
|
|
datetime(2012, 12, 29),
|
|
True,
|
|
),
|
|
(
|
|
makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
|
|
),
|
|
datetime(2011, 12, 31),
|
|
True,
|
|
),
|
|
(
|
|
makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
|
|
),
|
|
datetime(2010, 12, 25),
|
|
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)
|
|
|
|
def test_year_has_extra_week(self):
|
|
# End of long Q1
|
|
assert makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
|
|
).year_has_extra_week(datetime(2011, 4, 2))
|
|
|
|
# Start of long Q1
|
|
assert makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
|
|
).year_has_extra_week(datetime(2010, 12, 26))
|
|
|
|
# End of year before year with long Q1
|
|
assert not makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
|
|
).year_has_extra_week(datetime(2010, 12, 25))
|
|
|
|
for year in [
|
|
x for x in range(1994, 2011 + 1) if x not in [2011, 2005, 2000, 1994]
|
|
]:
|
|
assert not makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
|
|
).year_has_extra_week(datetime(year, 4, 2))
|
|
|
|
# Other long years
|
|
assert makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
|
|
).year_has_extra_week(datetime(2005, 4, 2))
|
|
|
|
assert makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
|
|
).year_has_extra_week(datetime(2000, 4, 2))
|
|
|
|
assert makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
|
|
).year_has_extra_week(datetime(1994, 4, 2))
|
|
|
|
def test_get_weeks(self):
|
|
sat_dec_1 = makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
|
|
)
|
|
sat_dec_4 = makeFY5253LastOfMonthQuarter(
|
|
1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
)
|
|
|
|
assert sat_dec_1.get_weeks(datetime(2011, 4, 2)) == [14, 13, 13, 13]
|
|
assert sat_dec_4.get_weeks(datetime(2011, 4, 2)) == [13, 13, 13, 14]
|
|
assert sat_dec_1.get_weeks(datetime(2010, 12, 25)) == [13, 13, 13, 13]
|
|
|
|
|
|
class TestFY5253NearestEndMonthQuarter(Base):
|
|
|
|
offset_nem_sat_aug_4 = makeFY5253NearestEndMonthQuarter(
|
|
1, startingMonth=8, weekday=WeekDay.SAT, qtr_with_extra_week=4
|
|
)
|
|
offset_nem_thu_aug_4 = makeFY5253NearestEndMonthQuarter(
|
|
1, startingMonth=8, weekday=WeekDay.THU, qtr_with_extra_week=4
|
|
)
|
|
offset_n = FY5253(weekday=WeekDay.TUE, startingMonth=12, variation="nearest")
|
|
|
|
on_offset_cases = [
|
|
# From Wikipedia
|
|
(offset_nem_sat_aug_4, datetime(2006, 9, 2), True),
|
|
(offset_nem_sat_aug_4, datetime(2007, 9, 1), True),
|
|
(offset_nem_sat_aug_4, datetime(2008, 8, 30), True),
|
|
(offset_nem_sat_aug_4, datetime(2009, 8, 29), True),
|
|
(offset_nem_sat_aug_4, datetime(2010, 8, 28), True),
|
|
(offset_nem_sat_aug_4, datetime(2011, 9, 3), True),
|
|
(offset_nem_sat_aug_4, datetime(2016, 9, 3), True),
|
|
(offset_nem_sat_aug_4, datetime(2017, 9, 2), True),
|
|
(offset_nem_sat_aug_4, datetime(2018, 9, 1), True),
|
|
(offset_nem_sat_aug_4, datetime(2019, 8, 31), True),
|
|
(offset_nem_sat_aug_4, datetime(2006, 8, 27), False),
|
|
(offset_nem_sat_aug_4, datetime(2007, 8, 28), False),
|
|
(offset_nem_sat_aug_4, datetime(2008, 8, 31), False),
|
|
(offset_nem_sat_aug_4, datetime(2009, 8, 30), False),
|
|
(offset_nem_sat_aug_4, datetime(2010, 8, 29), False),
|
|
(offset_nem_sat_aug_4, datetime(2011, 8, 28), False),
|
|
(offset_nem_sat_aug_4, datetime(2006, 8, 25), False),
|
|
(offset_nem_sat_aug_4, datetime(2007, 8, 24), False),
|
|
(offset_nem_sat_aug_4, datetime(2008, 8, 29), False),
|
|
(offset_nem_sat_aug_4, datetime(2009, 8, 28), False),
|
|
(offset_nem_sat_aug_4, datetime(2010, 8, 27), False),
|
|
(offset_nem_sat_aug_4, datetime(2011, 8, 26), False),
|
|
(offset_nem_sat_aug_4, datetime(2019, 8, 30), False),
|
|
# From Micron, see:
|
|
# http://google.brand.edgar-online.com/?sym=MU&formtypeID=7
|
|
(offset_nem_thu_aug_4, datetime(2012, 8, 30), True),
|
|
(offset_nem_thu_aug_4, datetime(2011, 9, 1), True),
|
|
# See: http://google.brand.edgar-online.com/?sym=MU&formtypeID=13
|
|
(offset_nem_thu_aug_4, datetime(2013, 5, 30), True),
|
|
(offset_nem_thu_aug_4, datetime(2013, 2, 28), True),
|
|
(offset_nem_thu_aug_4, datetime(2012, 11, 29), True),
|
|
(offset_nem_thu_aug_4, datetime(2012, 5, 31), True),
|
|
(offset_nem_thu_aug_4, datetime(2007, 3, 1), True),
|
|
(offset_nem_thu_aug_4, datetime(1994, 3, 3), True),
|
|
(offset_n, datetime(2012, 12, 31), False),
|
|
(offset_n, datetime(2013, 1, 1), True),
|
|
(offset_n, datetime(2013, 1, 2), 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)
|
|
|
|
def test_offset(self):
|
|
offset = makeFY5253NearestEndMonthQuarter(
|
|
1, startingMonth=8, weekday=WeekDay.THU, qtr_with_extra_week=4
|
|
)
|
|
|
|
MU = [
|
|
datetime(2012, 5, 31),
|
|
datetime(2012, 8, 30),
|
|
datetime(2012, 11, 29),
|
|
datetime(2013, 2, 28),
|
|
datetime(2013, 5, 30),
|
|
]
|
|
|
|
date = MU[0] + relativedelta(days=-1)
|
|
for expected in MU:
|
|
assert_offset_equal(offset, date, expected)
|
|
date = date + offset
|
|
|
|
assert_offset_equal(offset, datetime(2012, 5, 31), datetime(2012, 8, 30))
|
|
assert_offset_equal(offset, datetime(2012, 5, 30), datetime(2012, 5, 31))
|
|
|
|
offset2 = FY5253Quarter(
|
|
weekday=5, startingMonth=12, variation="last", qtr_with_extra_week=4
|
|
)
|
|
|
|
assert_offset_equal(offset2, datetime(2013, 1, 15), datetime(2013, 3, 30))
|
|
|
|
|
|
def test_bunched_yearends():
|
|
# GH#14774 cases with two fiscal year-ends in the same calendar-year
|
|
fy = FY5253(n=1, weekday=5, startingMonth=12, variation="nearest")
|
|
dt = Timestamp("2004-01-01")
|
|
assert fy.rollback(dt) == Timestamp("2002-12-28")
|
|
assert (-fy)._apply(dt) == Timestamp("2002-12-28")
|
|
assert dt - fy == Timestamp("2002-12-28")
|
|
|
|
assert fy.rollforward(dt) == Timestamp("2004-01-03")
|
|
assert fy._apply(dt) == Timestamp("2004-01-03")
|
|
assert fy + dt == Timestamp("2004-01-03")
|
|
assert dt + fy == Timestamp("2004-01-03")
|
|
|
|
# Same thing, but starting from a Timestamp in the previous year.
|
|
dt = Timestamp("2003-12-31")
|
|
assert fy.rollback(dt) == Timestamp("2002-12-28")
|
|
assert (-fy)._apply(dt) == Timestamp("2002-12-28")
|
|
assert dt - fy == Timestamp("2002-12-28")
|
|
|
|
|
|
def test_fy5253_last_onoffset():
|
|
# GH#18877 dates on the year-end but not normalized to midnight
|
|
offset = FY5253(n=-5, startingMonth=5, variation="last", weekday=0)
|
|
ts = Timestamp("1984-05-28 06:29:43.955911354+0200", tz="Europe/San_Marino")
|
|
fast = offset.is_on_offset(ts)
|
|
slow = (ts + offset) - offset == ts
|
|
assert fast == slow
|
|
|
|
|
|
def test_fy5253_nearest_onoffset():
|
|
# GH#18877 dates on the year-end but not normalized to midnight
|
|
offset = FY5253(n=3, startingMonth=7, variation="nearest", weekday=2)
|
|
ts = Timestamp("2032-07-28 00:12:59.035729419+0000", tz="Africa/Dakar")
|
|
fast = offset.is_on_offset(ts)
|
|
slow = (ts + offset) - offset == ts
|
|
assert fast == slow
|
|
|
|
|
|
def test_fy5253qtr_onoffset_nearest():
|
|
# GH#19036
|
|
ts = Timestamp("1985-09-02 23:57:46.232550356-0300", tz="Atlantic/Bermuda")
|
|
offset = FY5253Quarter(
|
|
n=3, qtr_with_extra_week=1, startingMonth=2, variation="nearest", weekday=0
|
|
)
|
|
fast = offset.is_on_offset(ts)
|
|
slow = (ts + offset) - offset == ts
|
|
assert fast == slow
|
|
|
|
|
|
def test_fy5253qtr_onoffset_last():
|
|
# GH#19036
|
|
offset = FY5253Quarter(
|
|
n=-2, qtr_with_extra_week=1, startingMonth=7, variation="last", weekday=2
|
|
)
|
|
ts = Timestamp("2011-01-26 19:03:40.331096129+0200", tz="Africa/Windhoek")
|
|
slow = (ts + offset) - offset == ts
|
|
fast = offset.is_on_offset(ts)
|
|
assert fast == slow
|