test_fiscal.py 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. """
  2. Tests for Fiscal Year and Fiscal Quarter offset classes
  3. """
  4. from datetime import datetime
  5. from dateutil.relativedelta import relativedelta
  6. import pytest
  7. from pandas import Timestamp
  8. import pandas._testing as tm
  9. from pandas.tests.tseries.offsets.common import (
  10. WeekDay,
  11. assert_is_on_offset,
  12. assert_offset_equal,
  13. )
  14. from pandas.tseries.offsets import (
  15. FY5253,
  16. FY5253Quarter,
  17. )
  18. def makeFY5253LastOfMonthQuarter(*args, **kwds):
  19. return FY5253Quarter(*args, variation="last", **kwds)
  20. def makeFY5253NearestEndMonthQuarter(*args, **kwds):
  21. return FY5253Quarter(*args, variation="nearest", **kwds)
  22. def makeFY5253NearestEndMonth(*args, **kwds):
  23. return FY5253(*args, variation="nearest", **kwds)
  24. def makeFY5253LastOfMonth(*args, **kwds):
  25. return FY5253(*args, variation="last", **kwds)
  26. def test_get_offset_name():
  27. assert (
  28. makeFY5253LastOfMonthQuarter(
  29. weekday=1, startingMonth=3, qtr_with_extra_week=4
  30. ).freqstr
  31. == "REQ-L-MAR-TUE-4"
  32. )
  33. assert (
  34. makeFY5253NearestEndMonthQuarter(
  35. weekday=1, startingMonth=3, qtr_with_extra_week=3
  36. ).freqstr
  37. == "REQ-N-MAR-TUE-3"
  38. )
  39. class TestFY5253LastOfMonth:
  40. offset_lom_sat_aug = makeFY5253LastOfMonth(1, startingMonth=8, weekday=WeekDay.SAT)
  41. offset_lom_sat_sep = makeFY5253LastOfMonth(1, startingMonth=9, weekday=WeekDay.SAT)
  42. on_offset_cases = [
  43. # From Wikipedia (see:
  44. # https://en.wikipedia.org/wiki/4%E2%80%934%E2%80%935_calendar#Last_Saturday_of_the_month_at_fiscal_year_end)
  45. (offset_lom_sat_aug, datetime(2006, 8, 26), True),
  46. (offset_lom_sat_aug, datetime(2007, 8, 25), True),
  47. (offset_lom_sat_aug, datetime(2008, 8, 30), True),
  48. (offset_lom_sat_aug, datetime(2009, 8, 29), True),
  49. (offset_lom_sat_aug, datetime(2010, 8, 28), True),
  50. (offset_lom_sat_aug, datetime(2011, 8, 27), True),
  51. (offset_lom_sat_aug, datetime(2012, 8, 25), True),
  52. (offset_lom_sat_aug, datetime(2013, 8, 31), True),
  53. (offset_lom_sat_aug, datetime(2014, 8, 30), True),
  54. (offset_lom_sat_aug, datetime(2015, 8, 29), True),
  55. (offset_lom_sat_aug, datetime(2016, 8, 27), True),
  56. (offset_lom_sat_aug, datetime(2017, 8, 26), True),
  57. (offset_lom_sat_aug, datetime(2018, 8, 25), True),
  58. (offset_lom_sat_aug, datetime(2019, 8, 31), True),
  59. (offset_lom_sat_aug, datetime(2006, 8, 27), False),
  60. (offset_lom_sat_aug, datetime(2007, 8, 28), False),
  61. (offset_lom_sat_aug, datetime(2008, 8, 31), False),
  62. (offset_lom_sat_aug, datetime(2009, 8, 30), False),
  63. (offset_lom_sat_aug, datetime(2010, 8, 29), False),
  64. (offset_lom_sat_aug, datetime(2011, 8, 28), False),
  65. (offset_lom_sat_aug, datetime(2006, 8, 25), False),
  66. (offset_lom_sat_aug, datetime(2007, 8, 24), False),
  67. (offset_lom_sat_aug, datetime(2008, 8, 29), False),
  68. (offset_lom_sat_aug, datetime(2009, 8, 28), False),
  69. (offset_lom_sat_aug, datetime(2010, 8, 27), False),
  70. (offset_lom_sat_aug, datetime(2011, 8, 26), False),
  71. (offset_lom_sat_aug, datetime(2019, 8, 30), False),
  72. # From GMCR (see for example:
  73. # http://yahoo.brand.edgar-online.com/Default.aspx?
  74. # companyid=3184&formtypeID=7)
  75. (offset_lom_sat_sep, datetime(2010, 9, 25), True),
  76. (offset_lom_sat_sep, datetime(2011, 9, 24), True),
  77. (offset_lom_sat_sep, datetime(2012, 9, 29), True),
  78. ]
  79. @pytest.mark.parametrize("case", on_offset_cases)
  80. def test_is_on_offset(self, case):
  81. offset, dt, expected = case
  82. assert_is_on_offset(offset, dt, expected)
  83. def test_apply(self):
  84. offset_lom_aug_sat = makeFY5253LastOfMonth(startingMonth=8, weekday=WeekDay.SAT)
  85. offset_lom_aug_sat_1 = makeFY5253LastOfMonth(
  86. n=1, startingMonth=8, weekday=WeekDay.SAT
  87. )
  88. date_seq_lom_aug_sat = [
  89. datetime(2006, 8, 26),
  90. datetime(2007, 8, 25),
  91. datetime(2008, 8, 30),
  92. datetime(2009, 8, 29),
  93. datetime(2010, 8, 28),
  94. datetime(2011, 8, 27),
  95. datetime(2012, 8, 25),
  96. datetime(2013, 8, 31),
  97. datetime(2014, 8, 30),
  98. datetime(2015, 8, 29),
  99. datetime(2016, 8, 27),
  100. ]
  101. tests = [
  102. (offset_lom_aug_sat, date_seq_lom_aug_sat),
  103. (offset_lom_aug_sat_1, date_seq_lom_aug_sat),
  104. (offset_lom_aug_sat, [datetime(2006, 8, 25)] + date_seq_lom_aug_sat),
  105. (offset_lom_aug_sat_1, [datetime(2006, 8, 27)] + date_seq_lom_aug_sat[1:]),
  106. (
  107. makeFY5253LastOfMonth(n=-1, startingMonth=8, weekday=WeekDay.SAT),
  108. list(reversed(date_seq_lom_aug_sat)),
  109. ),
  110. ]
  111. for test in tests:
  112. offset, data = test
  113. current = data[0]
  114. for datum in data[1:]:
  115. current = current + offset
  116. assert current == datum
  117. class TestFY5253NearestEndMonth:
  118. def test_get_year_end(self):
  119. assert makeFY5253NearestEndMonth(
  120. startingMonth=8, weekday=WeekDay.SAT
  121. ).get_year_end(datetime(2013, 1, 1)) == datetime(2013, 8, 31)
  122. assert makeFY5253NearestEndMonth(
  123. startingMonth=8, weekday=WeekDay.SUN
  124. ).get_year_end(datetime(2013, 1, 1)) == datetime(2013, 9, 1)
  125. assert makeFY5253NearestEndMonth(
  126. startingMonth=8, weekday=WeekDay.FRI
  127. ).get_year_end(datetime(2013, 1, 1)) == datetime(2013, 8, 30)
  128. offset_n = FY5253(weekday=WeekDay.TUE, startingMonth=12, variation="nearest")
  129. assert offset_n.get_year_end(datetime(2012, 1, 1)) == datetime(2013, 1, 1)
  130. assert offset_n.get_year_end(datetime(2012, 1, 10)) == datetime(2013, 1, 1)
  131. assert offset_n.get_year_end(datetime(2013, 1, 1)) == datetime(2013, 12, 31)
  132. assert offset_n.get_year_end(datetime(2013, 1, 2)) == datetime(2013, 12, 31)
  133. assert offset_n.get_year_end(datetime(2013, 1, 3)) == datetime(2013, 12, 31)
  134. assert offset_n.get_year_end(datetime(2013, 1, 10)) == datetime(2013, 12, 31)
  135. JNJ = FY5253(n=1, startingMonth=12, weekday=6, variation="nearest")
  136. assert JNJ.get_year_end(datetime(2006, 1, 1)) == datetime(2006, 12, 31)
  137. offset_lom_aug_sat = makeFY5253NearestEndMonth(
  138. 1, startingMonth=8, weekday=WeekDay.SAT
  139. )
  140. offset_lom_aug_thu = makeFY5253NearestEndMonth(
  141. 1, startingMonth=8, weekday=WeekDay.THU
  142. )
  143. offset_n = FY5253(weekday=WeekDay.TUE, startingMonth=12, variation="nearest")
  144. on_offset_cases = [
  145. # From Wikipedia (see:
  146. # https://en.wikipedia.org/wiki/4%E2%80%934%E2%80%935_calendar
  147. # #Saturday_nearest_the_end_of_month)
  148. # 2006-09-02 2006 September 2
  149. # 2007-09-01 2007 September 1
  150. # 2008-08-30 2008 August 30 (leap year)
  151. # 2009-08-29 2009 August 29
  152. # 2010-08-28 2010 August 28
  153. # 2011-09-03 2011 September 3
  154. # 2012-09-01 2012 September 1 (leap year)
  155. # 2013-08-31 2013 August 31
  156. # 2014-08-30 2014 August 30
  157. # 2015-08-29 2015 August 29
  158. # 2016-09-03 2016 September 3 (leap year)
  159. # 2017-09-02 2017 September 2
  160. # 2018-09-01 2018 September 1
  161. # 2019-08-31 2019 August 31
  162. (offset_lom_aug_sat, datetime(2006, 9, 2), True),
  163. (offset_lom_aug_sat, datetime(2007, 9, 1), True),
  164. (offset_lom_aug_sat, datetime(2008, 8, 30), True),
  165. (offset_lom_aug_sat, datetime(2009, 8, 29), True),
  166. (offset_lom_aug_sat, datetime(2010, 8, 28), True),
  167. (offset_lom_aug_sat, datetime(2011, 9, 3), True),
  168. (offset_lom_aug_sat, datetime(2016, 9, 3), True),
  169. (offset_lom_aug_sat, datetime(2017, 9, 2), True),
  170. (offset_lom_aug_sat, datetime(2018, 9, 1), True),
  171. (offset_lom_aug_sat, datetime(2019, 8, 31), True),
  172. (offset_lom_aug_sat, datetime(2006, 8, 27), False),
  173. (offset_lom_aug_sat, datetime(2007, 8, 28), False),
  174. (offset_lom_aug_sat, datetime(2008, 8, 31), False),
  175. (offset_lom_aug_sat, datetime(2009, 8, 30), False),
  176. (offset_lom_aug_sat, datetime(2010, 8, 29), False),
  177. (offset_lom_aug_sat, datetime(2011, 8, 28), False),
  178. (offset_lom_aug_sat, datetime(2006, 8, 25), False),
  179. (offset_lom_aug_sat, datetime(2007, 8, 24), False),
  180. (offset_lom_aug_sat, datetime(2008, 8, 29), False),
  181. (offset_lom_aug_sat, datetime(2009, 8, 28), False),
  182. (offset_lom_aug_sat, datetime(2010, 8, 27), False),
  183. (offset_lom_aug_sat, datetime(2011, 8, 26), False),
  184. (offset_lom_aug_sat, datetime(2019, 8, 30), False),
  185. # From Micron, see:
  186. # http://google.brand.edgar-online.com/?sym=MU&formtypeID=7
  187. (offset_lom_aug_thu, datetime(2012, 8, 30), True),
  188. (offset_lom_aug_thu, datetime(2011, 9, 1), True),
  189. (offset_n, datetime(2012, 12, 31), False),
  190. (offset_n, datetime(2013, 1, 1), True),
  191. (offset_n, datetime(2013, 1, 2), False),
  192. ]
  193. @pytest.mark.parametrize("case", on_offset_cases)
  194. def test_is_on_offset(self, case):
  195. offset, dt, expected = case
  196. assert_is_on_offset(offset, dt, expected)
  197. def test_apply(self):
  198. date_seq_nem_8_sat = [
  199. datetime(2006, 9, 2),
  200. datetime(2007, 9, 1),
  201. datetime(2008, 8, 30),
  202. datetime(2009, 8, 29),
  203. datetime(2010, 8, 28),
  204. datetime(2011, 9, 3),
  205. ]
  206. JNJ = [
  207. datetime(2005, 1, 2),
  208. datetime(2006, 1, 1),
  209. datetime(2006, 12, 31),
  210. datetime(2007, 12, 30),
  211. datetime(2008, 12, 28),
  212. datetime(2010, 1, 3),
  213. datetime(2011, 1, 2),
  214. datetime(2012, 1, 1),
  215. datetime(2012, 12, 30),
  216. ]
  217. DEC_SAT = FY5253(n=-1, startingMonth=12, weekday=5, variation="nearest")
  218. tests = [
  219. (
  220. makeFY5253NearestEndMonth(startingMonth=8, weekday=WeekDay.SAT),
  221. date_seq_nem_8_sat,
  222. ),
  223. (
  224. makeFY5253NearestEndMonth(n=1, startingMonth=8, weekday=WeekDay.SAT),
  225. date_seq_nem_8_sat,
  226. ),
  227. (
  228. makeFY5253NearestEndMonth(startingMonth=8, weekday=WeekDay.SAT),
  229. [datetime(2006, 9, 1)] + date_seq_nem_8_sat,
  230. ),
  231. (
  232. makeFY5253NearestEndMonth(n=1, startingMonth=8, weekday=WeekDay.SAT),
  233. [datetime(2006, 9, 3)] + date_seq_nem_8_sat[1:],
  234. ),
  235. (
  236. makeFY5253NearestEndMonth(n=-1, startingMonth=8, weekday=WeekDay.SAT),
  237. list(reversed(date_seq_nem_8_sat)),
  238. ),
  239. (
  240. makeFY5253NearestEndMonth(n=1, startingMonth=12, weekday=WeekDay.SUN),
  241. JNJ,
  242. ),
  243. (
  244. makeFY5253NearestEndMonth(n=-1, startingMonth=12, weekday=WeekDay.SUN),
  245. list(reversed(JNJ)),
  246. ),
  247. (
  248. makeFY5253NearestEndMonth(n=1, startingMonth=12, weekday=WeekDay.SUN),
  249. [datetime(2005, 1, 2), datetime(2006, 1, 1)],
  250. ),
  251. (
  252. makeFY5253NearestEndMonth(n=1, startingMonth=12, weekday=WeekDay.SUN),
  253. [datetime(2006, 1, 2), datetime(2006, 12, 31)],
  254. ),
  255. (DEC_SAT, [datetime(2013, 1, 15), datetime(2012, 12, 29)]),
  256. ]
  257. for test in tests:
  258. offset, data = test
  259. current = data[0]
  260. for datum in data[1:]:
  261. current = current + offset
  262. assert current == datum
  263. class TestFY5253LastOfMonthQuarter:
  264. def test_is_anchored(self):
  265. msg = "FY5253Quarter.is_anchored is deprecated "
  266. with tm.assert_produces_warning(FutureWarning, match=msg):
  267. assert makeFY5253LastOfMonthQuarter(
  268. startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4
  269. ).is_anchored()
  270. assert makeFY5253LastOfMonthQuarter(
  271. weekday=WeekDay.SAT, startingMonth=3, qtr_with_extra_week=4
  272. ).is_anchored()
  273. assert not makeFY5253LastOfMonthQuarter(
  274. 2, startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4
  275. ).is_anchored()
  276. def test_equality(self):
  277. assert makeFY5253LastOfMonthQuarter(
  278. startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4
  279. ) == makeFY5253LastOfMonthQuarter(
  280. startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4
  281. )
  282. assert makeFY5253LastOfMonthQuarter(
  283. startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4
  284. ) != makeFY5253LastOfMonthQuarter(
  285. startingMonth=1, weekday=WeekDay.SUN, qtr_with_extra_week=4
  286. )
  287. assert makeFY5253LastOfMonthQuarter(
  288. startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4
  289. ) != makeFY5253LastOfMonthQuarter(
  290. startingMonth=2, weekday=WeekDay.SAT, qtr_with_extra_week=4
  291. )
  292. def test_offset(self):
  293. offset = makeFY5253LastOfMonthQuarter(
  294. 1, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4
  295. )
  296. offset2 = makeFY5253LastOfMonthQuarter(
  297. 2, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4
  298. )
  299. offset4 = makeFY5253LastOfMonthQuarter(
  300. 4, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4
  301. )
  302. offset_neg1 = makeFY5253LastOfMonthQuarter(
  303. -1, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4
  304. )
  305. offset_neg2 = makeFY5253LastOfMonthQuarter(
  306. -2, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4
  307. )
  308. GMCR = [
  309. datetime(2010, 3, 27),
  310. datetime(2010, 6, 26),
  311. datetime(2010, 9, 25),
  312. datetime(2010, 12, 25),
  313. datetime(2011, 3, 26),
  314. datetime(2011, 6, 25),
  315. datetime(2011, 9, 24),
  316. datetime(2011, 12, 24),
  317. datetime(2012, 3, 24),
  318. datetime(2012, 6, 23),
  319. datetime(2012, 9, 29),
  320. datetime(2012, 12, 29),
  321. datetime(2013, 3, 30),
  322. datetime(2013, 6, 29),
  323. ]
  324. assert_offset_equal(offset, base=GMCR[0], expected=GMCR[1])
  325. assert_offset_equal(
  326. offset, base=GMCR[0] + relativedelta(days=-1), expected=GMCR[0]
  327. )
  328. assert_offset_equal(offset, base=GMCR[1], expected=GMCR[2])
  329. assert_offset_equal(offset2, base=GMCR[0], expected=GMCR[2])
  330. assert_offset_equal(offset4, base=GMCR[0], expected=GMCR[4])
  331. assert_offset_equal(offset_neg1, base=GMCR[-1], expected=GMCR[-2])
  332. assert_offset_equal(
  333. offset_neg1, base=GMCR[-1] + relativedelta(days=+1), expected=GMCR[-1]
  334. )
  335. assert_offset_equal(offset_neg2, base=GMCR[-1], expected=GMCR[-3])
  336. date = GMCR[0] + relativedelta(days=-1)
  337. for expected in GMCR:
  338. assert_offset_equal(offset, date, expected)
  339. date = date + offset
  340. date = GMCR[-1] + relativedelta(days=+1)
  341. for expected in reversed(GMCR):
  342. assert_offset_equal(offset_neg1, date, expected)
  343. date = date + offset_neg1
  344. lomq_aug_sat_4 = makeFY5253LastOfMonthQuarter(
  345. 1, startingMonth=8, weekday=WeekDay.SAT, qtr_with_extra_week=4
  346. )
  347. lomq_sep_sat_4 = makeFY5253LastOfMonthQuarter(
  348. 1, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4
  349. )
  350. on_offset_cases = [
  351. # From Wikipedia
  352. (lomq_aug_sat_4, datetime(2006, 8, 26), True),
  353. (lomq_aug_sat_4, datetime(2007, 8, 25), True),
  354. (lomq_aug_sat_4, datetime(2008, 8, 30), True),
  355. (lomq_aug_sat_4, datetime(2009, 8, 29), True),
  356. (lomq_aug_sat_4, datetime(2010, 8, 28), True),
  357. (lomq_aug_sat_4, datetime(2011, 8, 27), True),
  358. (lomq_aug_sat_4, datetime(2019, 8, 31), True),
  359. (lomq_aug_sat_4, datetime(2006, 8, 27), False),
  360. (lomq_aug_sat_4, datetime(2007, 8, 28), False),
  361. (lomq_aug_sat_4, datetime(2008, 8, 31), False),
  362. (lomq_aug_sat_4, datetime(2009, 8, 30), False),
  363. (lomq_aug_sat_4, datetime(2010, 8, 29), False),
  364. (lomq_aug_sat_4, datetime(2011, 8, 28), False),
  365. (lomq_aug_sat_4, datetime(2006, 8, 25), False),
  366. (lomq_aug_sat_4, datetime(2007, 8, 24), False),
  367. (lomq_aug_sat_4, datetime(2008, 8, 29), False),
  368. (lomq_aug_sat_4, datetime(2009, 8, 28), False),
  369. (lomq_aug_sat_4, datetime(2010, 8, 27), False),
  370. (lomq_aug_sat_4, datetime(2011, 8, 26), False),
  371. (lomq_aug_sat_4, datetime(2019, 8, 30), False),
  372. # From GMCR
  373. (lomq_sep_sat_4, datetime(2010, 9, 25), True),
  374. (lomq_sep_sat_4, datetime(2011, 9, 24), True),
  375. (lomq_sep_sat_4, datetime(2012, 9, 29), True),
  376. (lomq_sep_sat_4, datetime(2013, 6, 29), True),
  377. (lomq_sep_sat_4, datetime(2012, 6, 23), True),
  378. (lomq_sep_sat_4, datetime(2012, 6, 30), False),
  379. (lomq_sep_sat_4, datetime(2013, 3, 30), True),
  380. (lomq_sep_sat_4, datetime(2012, 3, 24), True),
  381. (lomq_sep_sat_4, datetime(2012, 12, 29), True),
  382. (lomq_sep_sat_4, datetime(2011, 12, 24), True),
  383. # INTC (extra week in Q1)
  384. # See: http://www.intc.com/releasedetail.cfm?ReleaseID=542844
  385. (
  386. makeFY5253LastOfMonthQuarter(
  387. 1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
  388. ),
  389. datetime(2011, 4, 2),
  390. True,
  391. ),
  392. # see: http://google.brand.edgar-online.com/?sym=INTC&formtypeID=7
  393. (
  394. makeFY5253LastOfMonthQuarter(
  395. 1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
  396. ),
  397. datetime(2012, 12, 29),
  398. True,
  399. ),
  400. (
  401. makeFY5253LastOfMonthQuarter(
  402. 1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
  403. ),
  404. datetime(2011, 12, 31),
  405. True,
  406. ),
  407. (
  408. makeFY5253LastOfMonthQuarter(
  409. 1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
  410. ),
  411. datetime(2010, 12, 25),
  412. True,
  413. ),
  414. ]
  415. @pytest.mark.parametrize("case", on_offset_cases)
  416. def test_is_on_offset(self, case):
  417. offset, dt, expected = case
  418. assert_is_on_offset(offset, dt, expected)
  419. def test_year_has_extra_week(self):
  420. # End of long Q1
  421. assert makeFY5253LastOfMonthQuarter(
  422. 1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
  423. ).year_has_extra_week(datetime(2011, 4, 2))
  424. # Start of long Q1
  425. assert makeFY5253LastOfMonthQuarter(
  426. 1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
  427. ).year_has_extra_week(datetime(2010, 12, 26))
  428. # End of year before year with long Q1
  429. assert not makeFY5253LastOfMonthQuarter(
  430. 1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
  431. ).year_has_extra_week(datetime(2010, 12, 25))
  432. for year in [
  433. x for x in range(1994, 2011 + 1) if x not in [2011, 2005, 2000, 1994]
  434. ]:
  435. assert not makeFY5253LastOfMonthQuarter(
  436. 1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
  437. ).year_has_extra_week(datetime(year, 4, 2))
  438. # Other long years
  439. assert makeFY5253LastOfMonthQuarter(
  440. 1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
  441. ).year_has_extra_week(datetime(2005, 4, 2))
  442. assert makeFY5253LastOfMonthQuarter(
  443. 1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
  444. ).year_has_extra_week(datetime(2000, 4, 2))
  445. assert makeFY5253LastOfMonthQuarter(
  446. 1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
  447. ).year_has_extra_week(datetime(1994, 4, 2))
  448. def test_get_weeks(self):
  449. sat_dec_1 = makeFY5253LastOfMonthQuarter(
  450. 1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1
  451. )
  452. sat_dec_4 = makeFY5253LastOfMonthQuarter(
  453. 1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=4
  454. )
  455. assert sat_dec_1.get_weeks(datetime(2011, 4, 2)) == [14, 13, 13, 13]
  456. assert sat_dec_4.get_weeks(datetime(2011, 4, 2)) == [13, 13, 13, 14]
  457. assert sat_dec_1.get_weeks(datetime(2010, 12, 25)) == [13, 13, 13, 13]
  458. class TestFY5253NearestEndMonthQuarter:
  459. offset_nem_sat_aug_4 = makeFY5253NearestEndMonthQuarter(
  460. 1, startingMonth=8, weekday=WeekDay.SAT, qtr_with_extra_week=4
  461. )
  462. offset_nem_thu_aug_4 = makeFY5253NearestEndMonthQuarter(
  463. 1, startingMonth=8, weekday=WeekDay.THU, qtr_with_extra_week=4
  464. )
  465. offset_n = FY5253(weekday=WeekDay.TUE, startingMonth=12, variation="nearest")
  466. on_offset_cases = [
  467. # From Wikipedia
  468. (offset_nem_sat_aug_4, datetime(2006, 9, 2), True),
  469. (offset_nem_sat_aug_4, datetime(2007, 9, 1), True),
  470. (offset_nem_sat_aug_4, datetime(2008, 8, 30), True),
  471. (offset_nem_sat_aug_4, datetime(2009, 8, 29), True),
  472. (offset_nem_sat_aug_4, datetime(2010, 8, 28), True),
  473. (offset_nem_sat_aug_4, datetime(2011, 9, 3), True),
  474. (offset_nem_sat_aug_4, datetime(2016, 9, 3), True),
  475. (offset_nem_sat_aug_4, datetime(2017, 9, 2), True),
  476. (offset_nem_sat_aug_4, datetime(2018, 9, 1), True),
  477. (offset_nem_sat_aug_4, datetime(2019, 8, 31), True),
  478. (offset_nem_sat_aug_4, datetime(2006, 8, 27), False),
  479. (offset_nem_sat_aug_4, datetime(2007, 8, 28), False),
  480. (offset_nem_sat_aug_4, datetime(2008, 8, 31), False),
  481. (offset_nem_sat_aug_4, datetime(2009, 8, 30), False),
  482. (offset_nem_sat_aug_4, datetime(2010, 8, 29), False),
  483. (offset_nem_sat_aug_4, datetime(2011, 8, 28), False),
  484. (offset_nem_sat_aug_4, datetime(2006, 8, 25), False),
  485. (offset_nem_sat_aug_4, datetime(2007, 8, 24), False),
  486. (offset_nem_sat_aug_4, datetime(2008, 8, 29), False),
  487. (offset_nem_sat_aug_4, datetime(2009, 8, 28), False),
  488. (offset_nem_sat_aug_4, datetime(2010, 8, 27), False),
  489. (offset_nem_sat_aug_4, datetime(2011, 8, 26), False),
  490. (offset_nem_sat_aug_4, datetime(2019, 8, 30), False),
  491. # From Micron, see:
  492. # http://google.brand.edgar-online.com/?sym=MU&formtypeID=7
  493. (offset_nem_thu_aug_4, datetime(2012, 8, 30), True),
  494. (offset_nem_thu_aug_4, datetime(2011, 9, 1), True),
  495. # See: http://google.brand.edgar-online.com/?sym=MU&formtypeID=13
  496. (offset_nem_thu_aug_4, datetime(2013, 5, 30), True),
  497. (offset_nem_thu_aug_4, datetime(2013, 2, 28), True),
  498. (offset_nem_thu_aug_4, datetime(2012, 11, 29), True),
  499. (offset_nem_thu_aug_4, datetime(2012, 5, 31), True),
  500. (offset_nem_thu_aug_4, datetime(2007, 3, 1), True),
  501. (offset_nem_thu_aug_4, datetime(1994, 3, 3), True),
  502. (offset_n, datetime(2012, 12, 31), False),
  503. (offset_n, datetime(2013, 1, 1), True),
  504. (offset_n, datetime(2013, 1, 2), False),
  505. ]
  506. @pytest.mark.parametrize("case", on_offset_cases)
  507. def test_is_on_offset(self, case):
  508. offset, dt, expected = case
  509. assert_is_on_offset(offset, dt, expected)
  510. def test_offset(self):
  511. offset = makeFY5253NearestEndMonthQuarter(
  512. 1, startingMonth=8, weekday=WeekDay.THU, qtr_with_extra_week=4
  513. )
  514. MU = [
  515. datetime(2012, 5, 31),
  516. datetime(2012, 8, 30),
  517. datetime(2012, 11, 29),
  518. datetime(2013, 2, 28),
  519. datetime(2013, 5, 30),
  520. ]
  521. date = MU[0] + relativedelta(days=-1)
  522. for expected in MU:
  523. assert_offset_equal(offset, date, expected)
  524. date = date + offset
  525. assert_offset_equal(offset, datetime(2012, 5, 31), datetime(2012, 8, 30))
  526. assert_offset_equal(offset, datetime(2012, 5, 30), datetime(2012, 5, 31))
  527. offset2 = FY5253Quarter(
  528. weekday=5, startingMonth=12, variation="last", qtr_with_extra_week=4
  529. )
  530. assert_offset_equal(offset2, datetime(2013, 1, 15), datetime(2013, 3, 30))
  531. def test_bunched_yearends():
  532. # GH#14774 cases with two fiscal year-ends in the same calendar-year
  533. fy = FY5253(n=1, weekday=5, startingMonth=12, variation="nearest")
  534. dt = Timestamp("2004-01-01")
  535. assert fy.rollback(dt) == Timestamp("2002-12-28")
  536. assert (-fy)._apply(dt) == Timestamp("2002-12-28")
  537. assert dt - fy == Timestamp("2002-12-28")
  538. assert fy.rollforward(dt) == Timestamp("2004-01-03")
  539. assert fy._apply(dt) == Timestamp("2004-01-03")
  540. assert fy + dt == Timestamp("2004-01-03")
  541. assert dt + fy == Timestamp("2004-01-03")
  542. # Same thing, but starting from a Timestamp in the previous year.
  543. dt = Timestamp("2003-12-31")
  544. assert fy.rollback(dt) == Timestamp("2002-12-28")
  545. assert (-fy)._apply(dt) == Timestamp("2002-12-28")
  546. assert dt - fy == Timestamp("2002-12-28")
  547. def test_fy5253_last_onoffset():
  548. # GH#18877 dates on the year-end but not normalized to midnight
  549. offset = FY5253(n=-5, startingMonth=5, variation="last", weekday=0)
  550. ts = Timestamp("1984-05-28 06:29:43.955911354+0200", tz="Europe/San_Marino")
  551. fast = offset.is_on_offset(ts)
  552. slow = (ts + offset) - offset == ts
  553. assert fast == slow
  554. def test_fy5253_nearest_onoffset():
  555. # GH#18877 dates on the year-end but not normalized to midnight
  556. offset = FY5253(n=3, startingMonth=7, variation="nearest", weekday=2)
  557. ts = Timestamp("2032-07-28 00:12:59.035729419+0000", tz="Africa/Dakar")
  558. fast = offset.is_on_offset(ts)
  559. slow = (ts + offset) - offset == ts
  560. assert fast == slow
  561. def test_fy5253qtr_onoffset_nearest():
  562. # GH#19036
  563. ts = Timestamp("1985-09-02 23:57:46.232550356-0300", tz="Atlantic/Bermuda")
  564. offset = FY5253Quarter(
  565. n=3, qtr_with_extra_week=1, startingMonth=2, variation="nearest", weekday=0
  566. )
  567. fast = offset.is_on_offset(ts)
  568. slow = (ts + offset) - offset == ts
  569. assert fast == slow
  570. def test_fy5253qtr_onoffset_last():
  571. # GH#19036
  572. offset = FY5253Quarter(
  573. n=-2, qtr_with_extra_week=1, startingMonth=7, variation="last", weekday=2
  574. )
  575. ts = Timestamp("2011-01-26 19:03:40.331096129+0200", tz="Africa/Windhoek")
  576. slow = (ts + offset) - offset == ts
  577. fast = offset.is_on_offset(ts)
  578. assert fast == slow