test_asfreq.py 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  1. import pytest
  2. from pandas._libs.tslibs.dtypes import _period_code_map
  3. from pandas._libs.tslibs.period import INVALID_FREQ_ERR_MSG
  4. from pandas.errors import OutOfBoundsDatetime
  5. from pandas import (
  6. Period,
  7. Timestamp,
  8. offsets,
  9. )
  10. class TestFreqConversion:
  11. """Test frequency conversion of date objects"""
  12. @pytest.mark.parametrize("freq", ["A", "Q", "M", "W", "B", "D"])
  13. def test_asfreq_near_zero(self, freq):
  14. # GH#19643, GH#19650
  15. per = Period("0001-01-01", freq=freq)
  16. tup1 = (per.year, per.hour, per.day)
  17. prev = per - 1
  18. assert prev.ordinal == per.ordinal - 1
  19. tup2 = (prev.year, prev.month, prev.day)
  20. assert tup2 < tup1
  21. def test_asfreq_near_zero_weekly(self):
  22. # GH#19834
  23. per1 = Period("0001-01-01", "D") + 6
  24. per2 = Period("0001-01-01", "D") - 6
  25. week1 = per1.asfreq("W")
  26. week2 = per2.asfreq("W")
  27. assert week1 != week2
  28. assert week1.asfreq("D", "E") >= per1
  29. assert week2.asfreq("D", "S") <= per2
  30. def test_to_timestamp_out_of_bounds(self):
  31. # GH#19643, used to incorrectly give Timestamp in 1754
  32. per = Period("0001-01-01", freq="B")
  33. msg = "Out of bounds nanosecond timestamp"
  34. with pytest.raises(OutOfBoundsDatetime, match=msg):
  35. per.to_timestamp()
  36. def test_asfreq_corner(self):
  37. val = Period(freq="A", year=2007)
  38. result1 = val.asfreq("5t")
  39. result2 = val.asfreq("t")
  40. expected = Period("2007-12-31 23:59", freq="t")
  41. assert result1.ordinal == expected.ordinal
  42. assert result1.freqstr == "5T"
  43. assert result2.ordinal == expected.ordinal
  44. assert result2.freqstr == "T"
  45. def test_conv_annual(self):
  46. # frequency conversion tests: from Annual Frequency
  47. ival_A = Period(freq="A", year=2007)
  48. ival_AJAN = Period(freq="A-JAN", year=2007)
  49. ival_AJUN = Period(freq="A-JUN", year=2007)
  50. ival_ANOV = Period(freq="A-NOV", year=2007)
  51. ival_A_to_Q_start = Period(freq="Q", year=2007, quarter=1)
  52. ival_A_to_Q_end = Period(freq="Q", year=2007, quarter=4)
  53. ival_A_to_M_start = Period(freq="M", year=2007, month=1)
  54. ival_A_to_M_end = Period(freq="M", year=2007, month=12)
  55. ival_A_to_W_start = Period(freq="W", year=2007, month=1, day=1)
  56. ival_A_to_W_end = Period(freq="W", year=2007, month=12, day=31)
  57. ival_A_to_B_start = Period(freq="B", year=2007, month=1, day=1)
  58. ival_A_to_B_end = Period(freq="B", year=2007, month=12, day=31)
  59. ival_A_to_D_start = Period(freq="D", year=2007, month=1, day=1)
  60. ival_A_to_D_end = Period(freq="D", year=2007, month=12, day=31)
  61. ival_A_to_H_start = Period(freq="H", year=2007, month=1, day=1, hour=0)
  62. ival_A_to_H_end = Period(freq="H", year=2007, month=12, day=31, hour=23)
  63. ival_A_to_T_start = Period(
  64. freq="Min", year=2007, month=1, day=1, hour=0, minute=0
  65. )
  66. ival_A_to_T_end = Period(
  67. freq="Min", year=2007, month=12, day=31, hour=23, minute=59
  68. )
  69. ival_A_to_S_start = Period(
  70. freq="S", year=2007, month=1, day=1, hour=0, minute=0, second=0
  71. )
  72. ival_A_to_S_end = Period(
  73. freq="S", year=2007, month=12, day=31, hour=23, minute=59, second=59
  74. )
  75. ival_AJAN_to_D_end = Period(freq="D", year=2007, month=1, day=31)
  76. ival_AJAN_to_D_start = Period(freq="D", year=2006, month=2, day=1)
  77. ival_AJUN_to_D_end = Period(freq="D", year=2007, month=6, day=30)
  78. ival_AJUN_to_D_start = Period(freq="D", year=2006, month=7, day=1)
  79. ival_ANOV_to_D_end = Period(freq="D", year=2007, month=11, day=30)
  80. ival_ANOV_to_D_start = Period(freq="D", year=2006, month=12, day=1)
  81. assert ival_A.asfreq("Q", "S") == ival_A_to_Q_start
  82. assert ival_A.asfreq("Q", "e") == ival_A_to_Q_end
  83. assert ival_A.asfreq("M", "s") == ival_A_to_M_start
  84. assert ival_A.asfreq("M", "E") == ival_A_to_M_end
  85. assert ival_A.asfreq("W", "S") == ival_A_to_W_start
  86. assert ival_A.asfreq("W", "E") == ival_A_to_W_end
  87. assert ival_A.asfreq("B", "S") == ival_A_to_B_start
  88. assert ival_A.asfreq("B", "E") == ival_A_to_B_end
  89. assert ival_A.asfreq("D", "S") == ival_A_to_D_start
  90. assert ival_A.asfreq("D", "E") == ival_A_to_D_end
  91. assert ival_A.asfreq("H", "S") == ival_A_to_H_start
  92. assert ival_A.asfreq("H", "E") == ival_A_to_H_end
  93. assert ival_A.asfreq("min", "S") == ival_A_to_T_start
  94. assert ival_A.asfreq("min", "E") == ival_A_to_T_end
  95. assert ival_A.asfreq("T", "S") == ival_A_to_T_start
  96. assert ival_A.asfreq("T", "E") == ival_A_to_T_end
  97. assert ival_A.asfreq("S", "S") == ival_A_to_S_start
  98. assert ival_A.asfreq("S", "E") == ival_A_to_S_end
  99. assert ival_AJAN.asfreq("D", "S") == ival_AJAN_to_D_start
  100. assert ival_AJAN.asfreq("D", "E") == ival_AJAN_to_D_end
  101. assert ival_AJUN.asfreq("D", "S") == ival_AJUN_to_D_start
  102. assert ival_AJUN.asfreq("D", "E") == ival_AJUN_to_D_end
  103. assert ival_ANOV.asfreq("D", "S") == ival_ANOV_to_D_start
  104. assert ival_ANOV.asfreq("D", "E") == ival_ANOV_to_D_end
  105. assert ival_A.asfreq("A") == ival_A
  106. def test_conv_quarterly(self):
  107. # frequency conversion tests: from Quarterly Frequency
  108. ival_Q = Period(freq="Q", year=2007, quarter=1)
  109. ival_Q_end_of_year = Period(freq="Q", year=2007, quarter=4)
  110. ival_QEJAN = Period(freq="Q-JAN", year=2007, quarter=1)
  111. ival_QEJUN = Period(freq="Q-JUN", year=2007, quarter=1)
  112. ival_Q_to_A = Period(freq="A", year=2007)
  113. ival_Q_to_M_start = Period(freq="M", year=2007, month=1)
  114. ival_Q_to_M_end = Period(freq="M", year=2007, month=3)
  115. ival_Q_to_W_start = Period(freq="W", year=2007, month=1, day=1)
  116. ival_Q_to_W_end = Period(freq="W", year=2007, month=3, day=31)
  117. ival_Q_to_B_start = Period(freq="B", year=2007, month=1, day=1)
  118. ival_Q_to_B_end = Period(freq="B", year=2007, month=3, day=30)
  119. ival_Q_to_D_start = Period(freq="D", year=2007, month=1, day=1)
  120. ival_Q_to_D_end = Period(freq="D", year=2007, month=3, day=31)
  121. ival_Q_to_H_start = Period(freq="H", year=2007, month=1, day=1, hour=0)
  122. ival_Q_to_H_end = Period(freq="H", year=2007, month=3, day=31, hour=23)
  123. ival_Q_to_T_start = Period(
  124. freq="Min", year=2007, month=1, day=1, hour=0, minute=0
  125. )
  126. ival_Q_to_T_end = Period(
  127. freq="Min", year=2007, month=3, day=31, hour=23, minute=59
  128. )
  129. ival_Q_to_S_start = Period(
  130. freq="S", year=2007, month=1, day=1, hour=0, minute=0, second=0
  131. )
  132. ival_Q_to_S_end = Period(
  133. freq="S", year=2007, month=3, day=31, hour=23, minute=59, second=59
  134. )
  135. ival_QEJAN_to_D_start = Period(freq="D", year=2006, month=2, day=1)
  136. ival_QEJAN_to_D_end = Period(freq="D", year=2006, month=4, day=30)
  137. ival_QEJUN_to_D_start = Period(freq="D", year=2006, month=7, day=1)
  138. ival_QEJUN_to_D_end = Period(freq="D", year=2006, month=9, day=30)
  139. assert ival_Q.asfreq("A") == ival_Q_to_A
  140. assert ival_Q_end_of_year.asfreq("A") == ival_Q_to_A
  141. assert ival_Q.asfreq("M", "S") == ival_Q_to_M_start
  142. assert ival_Q.asfreq("M", "E") == ival_Q_to_M_end
  143. assert ival_Q.asfreq("W", "S") == ival_Q_to_W_start
  144. assert ival_Q.asfreq("W", "E") == ival_Q_to_W_end
  145. assert ival_Q.asfreq("B", "S") == ival_Q_to_B_start
  146. assert ival_Q.asfreq("B", "E") == ival_Q_to_B_end
  147. assert ival_Q.asfreq("D", "S") == ival_Q_to_D_start
  148. assert ival_Q.asfreq("D", "E") == ival_Q_to_D_end
  149. assert ival_Q.asfreq("H", "S") == ival_Q_to_H_start
  150. assert ival_Q.asfreq("H", "E") == ival_Q_to_H_end
  151. assert ival_Q.asfreq("Min", "S") == ival_Q_to_T_start
  152. assert ival_Q.asfreq("Min", "E") == ival_Q_to_T_end
  153. assert ival_Q.asfreq("S", "S") == ival_Q_to_S_start
  154. assert ival_Q.asfreq("S", "E") == ival_Q_to_S_end
  155. assert ival_QEJAN.asfreq("D", "S") == ival_QEJAN_to_D_start
  156. assert ival_QEJAN.asfreq("D", "E") == ival_QEJAN_to_D_end
  157. assert ival_QEJUN.asfreq("D", "S") == ival_QEJUN_to_D_start
  158. assert ival_QEJUN.asfreq("D", "E") == ival_QEJUN_to_D_end
  159. assert ival_Q.asfreq("Q") == ival_Q
  160. def test_conv_monthly(self):
  161. # frequency conversion tests: from Monthly Frequency
  162. ival_M = Period(freq="M", year=2007, month=1)
  163. ival_M_end_of_year = Period(freq="M", year=2007, month=12)
  164. ival_M_end_of_quarter = Period(freq="M", year=2007, month=3)
  165. ival_M_to_A = Period(freq="A", year=2007)
  166. ival_M_to_Q = Period(freq="Q", year=2007, quarter=1)
  167. ival_M_to_W_start = Period(freq="W", year=2007, month=1, day=1)
  168. ival_M_to_W_end = Period(freq="W", year=2007, month=1, day=31)
  169. ival_M_to_B_start = Period(freq="B", year=2007, month=1, day=1)
  170. ival_M_to_B_end = Period(freq="B", year=2007, month=1, day=31)
  171. ival_M_to_D_start = Period(freq="D", year=2007, month=1, day=1)
  172. ival_M_to_D_end = Period(freq="D", year=2007, month=1, day=31)
  173. ival_M_to_H_start = Period(freq="H", year=2007, month=1, day=1, hour=0)
  174. ival_M_to_H_end = Period(freq="H", year=2007, month=1, day=31, hour=23)
  175. ival_M_to_T_start = Period(
  176. freq="Min", year=2007, month=1, day=1, hour=0, minute=0
  177. )
  178. ival_M_to_T_end = Period(
  179. freq="Min", year=2007, month=1, day=31, hour=23, minute=59
  180. )
  181. ival_M_to_S_start = Period(
  182. freq="S", year=2007, month=1, day=1, hour=0, minute=0, second=0
  183. )
  184. ival_M_to_S_end = Period(
  185. freq="S", year=2007, month=1, day=31, hour=23, minute=59, second=59
  186. )
  187. assert ival_M.asfreq("A") == ival_M_to_A
  188. assert ival_M_end_of_year.asfreq("A") == ival_M_to_A
  189. assert ival_M.asfreq("Q") == ival_M_to_Q
  190. assert ival_M_end_of_quarter.asfreq("Q") == ival_M_to_Q
  191. assert ival_M.asfreq("W", "S") == ival_M_to_W_start
  192. assert ival_M.asfreq("W", "E") == ival_M_to_W_end
  193. assert ival_M.asfreq("B", "S") == ival_M_to_B_start
  194. assert ival_M.asfreq("B", "E") == ival_M_to_B_end
  195. assert ival_M.asfreq("D", "S") == ival_M_to_D_start
  196. assert ival_M.asfreq("D", "E") == ival_M_to_D_end
  197. assert ival_M.asfreq("H", "S") == ival_M_to_H_start
  198. assert ival_M.asfreq("H", "E") == ival_M_to_H_end
  199. assert ival_M.asfreq("Min", "S") == ival_M_to_T_start
  200. assert ival_M.asfreq("Min", "E") == ival_M_to_T_end
  201. assert ival_M.asfreq("S", "S") == ival_M_to_S_start
  202. assert ival_M.asfreq("S", "E") == ival_M_to_S_end
  203. assert ival_M.asfreq("M") == ival_M
  204. def test_conv_weekly(self):
  205. # frequency conversion tests: from Weekly Frequency
  206. ival_W = Period(freq="W", year=2007, month=1, day=1)
  207. ival_WSUN = Period(freq="W", year=2007, month=1, day=7)
  208. ival_WSAT = Period(freq="W-SAT", year=2007, month=1, day=6)
  209. ival_WFRI = Period(freq="W-FRI", year=2007, month=1, day=5)
  210. ival_WTHU = Period(freq="W-THU", year=2007, month=1, day=4)
  211. ival_WWED = Period(freq="W-WED", year=2007, month=1, day=3)
  212. ival_WTUE = Period(freq="W-TUE", year=2007, month=1, day=2)
  213. ival_WMON = Period(freq="W-MON", year=2007, month=1, day=1)
  214. ival_WSUN_to_D_start = Period(freq="D", year=2007, month=1, day=1)
  215. ival_WSUN_to_D_end = Period(freq="D", year=2007, month=1, day=7)
  216. ival_WSAT_to_D_start = Period(freq="D", year=2006, month=12, day=31)
  217. ival_WSAT_to_D_end = Period(freq="D", year=2007, month=1, day=6)
  218. ival_WFRI_to_D_start = Period(freq="D", year=2006, month=12, day=30)
  219. ival_WFRI_to_D_end = Period(freq="D", year=2007, month=1, day=5)
  220. ival_WTHU_to_D_start = Period(freq="D", year=2006, month=12, day=29)
  221. ival_WTHU_to_D_end = Period(freq="D", year=2007, month=1, day=4)
  222. ival_WWED_to_D_start = Period(freq="D", year=2006, month=12, day=28)
  223. ival_WWED_to_D_end = Period(freq="D", year=2007, month=1, day=3)
  224. ival_WTUE_to_D_start = Period(freq="D", year=2006, month=12, day=27)
  225. ival_WTUE_to_D_end = Period(freq="D", year=2007, month=1, day=2)
  226. ival_WMON_to_D_start = Period(freq="D", year=2006, month=12, day=26)
  227. ival_WMON_to_D_end = Period(freq="D", year=2007, month=1, day=1)
  228. ival_W_end_of_year = Period(freq="W", year=2007, month=12, day=31)
  229. ival_W_end_of_quarter = Period(freq="W", year=2007, month=3, day=31)
  230. ival_W_end_of_month = Period(freq="W", year=2007, month=1, day=31)
  231. ival_W_to_A = Period(freq="A", year=2007)
  232. ival_W_to_Q = Period(freq="Q", year=2007, quarter=1)
  233. ival_W_to_M = Period(freq="M", year=2007, month=1)
  234. if Period(freq="D", year=2007, month=12, day=31).weekday == 6:
  235. ival_W_to_A_end_of_year = Period(freq="A", year=2007)
  236. else:
  237. ival_W_to_A_end_of_year = Period(freq="A", year=2008)
  238. if Period(freq="D", year=2007, month=3, day=31).weekday == 6:
  239. ival_W_to_Q_end_of_quarter = Period(freq="Q", year=2007, quarter=1)
  240. else:
  241. ival_W_to_Q_end_of_quarter = Period(freq="Q", year=2007, quarter=2)
  242. if Period(freq="D", year=2007, month=1, day=31).weekday == 6:
  243. ival_W_to_M_end_of_month = Period(freq="M", year=2007, month=1)
  244. else:
  245. ival_W_to_M_end_of_month = Period(freq="M", year=2007, month=2)
  246. ival_W_to_B_start = Period(freq="B", year=2007, month=1, day=1)
  247. ival_W_to_B_end = Period(freq="B", year=2007, month=1, day=5)
  248. ival_W_to_D_start = Period(freq="D", year=2007, month=1, day=1)
  249. ival_W_to_D_end = Period(freq="D", year=2007, month=1, day=7)
  250. ival_W_to_H_start = Period(freq="H", year=2007, month=1, day=1, hour=0)
  251. ival_W_to_H_end = Period(freq="H", year=2007, month=1, day=7, hour=23)
  252. ival_W_to_T_start = Period(
  253. freq="Min", year=2007, month=1, day=1, hour=0, minute=0
  254. )
  255. ival_W_to_T_end = Period(
  256. freq="Min", year=2007, month=1, day=7, hour=23, minute=59
  257. )
  258. ival_W_to_S_start = Period(
  259. freq="S", year=2007, month=1, day=1, hour=0, minute=0, second=0
  260. )
  261. ival_W_to_S_end = Period(
  262. freq="S", year=2007, month=1, day=7, hour=23, minute=59, second=59
  263. )
  264. assert ival_W.asfreq("A") == ival_W_to_A
  265. assert ival_W_end_of_year.asfreq("A") == ival_W_to_A_end_of_year
  266. assert ival_W.asfreq("Q") == ival_W_to_Q
  267. assert ival_W_end_of_quarter.asfreq("Q") == ival_W_to_Q_end_of_quarter
  268. assert ival_W.asfreq("M") == ival_W_to_M
  269. assert ival_W_end_of_month.asfreq("M") == ival_W_to_M_end_of_month
  270. assert ival_W.asfreq("B", "S") == ival_W_to_B_start
  271. assert ival_W.asfreq("B", "E") == ival_W_to_B_end
  272. assert ival_W.asfreq("D", "S") == ival_W_to_D_start
  273. assert ival_W.asfreq("D", "E") == ival_W_to_D_end
  274. assert ival_WSUN.asfreq("D", "S") == ival_WSUN_to_D_start
  275. assert ival_WSUN.asfreq("D", "E") == ival_WSUN_to_D_end
  276. assert ival_WSAT.asfreq("D", "S") == ival_WSAT_to_D_start
  277. assert ival_WSAT.asfreq("D", "E") == ival_WSAT_to_D_end
  278. assert ival_WFRI.asfreq("D", "S") == ival_WFRI_to_D_start
  279. assert ival_WFRI.asfreq("D", "E") == ival_WFRI_to_D_end
  280. assert ival_WTHU.asfreq("D", "S") == ival_WTHU_to_D_start
  281. assert ival_WTHU.asfreq("D", "E") == ival_WTHU_to_D_end
  282. assert ival_WWED.asfreq("D", "S") == ival_WWED_to_D_start
  283. assert ival_WWED.asfreq("D", "E") == ival_WWED_to_D_end
  284. assert ival_WTUE.asfreq("D", "S") == ival_WTUE_to_D_start
  285. assert ival_WTUE.asfreq("D", "E") == ival_WTUE_to_D_end
  286. assert ival_WMON.asfreq("D", "S") == ival_WMON_to_D_start
  287. assert ival_WMON.asfreq("D", "E") == ival_WMON_to_D_end
  288. assert ival_W.asfreq("H", "S") == ival_W_to_H_start
  289. assert ival_W.asfreq("H", "E") == ival_W_to_H_end
  290. assert ival_W.asfreq("Min", "S") == ival_W_to_T_start
  291. assert ival_W.asfreq("Min", "E") == ival_W_to_T_end
  292. assert ival_W.asfreq("S", "S") == ival_W_to_S_start
  293. assert ival_W.asfreq("S", "E") == ival_W_to_S_end
  294. assert ival_W.asfreq("W") == ival_W
  295. msg = INVALID_FREQ_ERR_MSG
  296. with pytest.raises(ValueError, match=msg):
  297. ival_W.asfreq("WK")
  298. def test_conv_weekly_legacy(self):
  299. # frequency conversion tests: from Weekly Frequency
  300. msg = INVALID_FREQ_ERR_MSG
  301. with pytest.raises(ValueError, match=msg):
  302. Period(freq="WK", year=2007, month=1, day=1)
  303. with pytest.raises(ValueError, match=msg):
  304. Period(freq="WK-SAT", year=2007, month=1, day=6)
  305. with pytest.raises(ValueError, match=msg):
  306. Period(freq="WK-FRI", year=2007, month=1, day=5)
  307. with pytest.raises(ValueError, match=msg):
  308. Period(freq="WK-THU", year=2007, month=1, day=4)
  309. with pytest.raises(ValueError, match=msg):
  310. Period(freq="WK-WED", year=2007, month=1, day=3)
  311. with pytest.raises(ValueError, match=msg):
  312. Period(freq="WK-TUE", year=2007, month=1, day=2)
  313. with pytest.raises(ValueError, match=msg):
  314. Period(freq="WK-MON", year=2007, month=1, day=1)
  315. def test_conv_business(self):
  316. # frequency conversion tests: from Business Frequency"
  317. ival_B = Period(freq="B", year=2007, month=1, day=1)
  318. ival_B_end_of_year = Period(freq="B", year=2007, month=12, day=31)
  319. ival_B_end_of_quarter = Period(freq="B", year=2007, month=3, day=30)
  320. ival_B_end_of_month = Period(freq="B", year=2007, month=1, day=31)
  321. ival_B_end_of_week = Period(freq="B", year=2007, month=1, day=5)
  322. ival_B_to_A = Period(freq="A", year=2007)
  323. ival_B_to_Q = Period(freq="Q", year=2007, quarter=1)
  324. ival_B_to_M = Period(freq="M", year=2007, month=1)
  325. ival_B_to_W = Period(freq="W", year=2007, month=1, day=7)
  326. ival_B_to_D = Period(freq="D", year=2007, month=1, day=1)
  327. ival_B_to_H_start = Period(freq="H", year=2007, month=1, day=1, hour=0)
  328. ival_B_to_H_end = Period(freq="H", year=2007, month=1, day=1, hour=23)
  329. ival_B_to_T_start = Period(
  330. freq="Min", year=2007, month=1, day=1, hour=0, minute=0
  331. )
  332. ival_B_to_T_end = Period(
  333. freq="Min", year=2007, month=1, day=1, hour=23, minute=59
  334. )
  335. ival_B_to_S_start = Period(
  336. freq="S", year=2007, month=1, day=1, hour=0, minute=0, second=0
  337. )
  338. ival_B_to_S_end = Period(
  339. freq="S", year=2007, month=1, day=1, hour=23, minute=59, second=59
  340. )
  341. assert ival_B.asfreq("A") == ival_B_to_A
  342. assert ival_B_end_of_year.asfreq("A") == ival_B_to_A
  343. assert ival_B.asfreq("Q") == ival_B_to_Q
  344. assert ival_B_end_of_quarter.asfreq("Q") == ival_B_to_Q
  345. assert ival_B.asfreq("M") == ival_B_to_M
  346. assert ival_B_end_of_month.asfreq("M") == ival_B_to_M
  347. assert ival_B.asfreq("W") == ival_B_to_W
  348. assert ival_B_end_of_week.asfreq("W") == ival_B_to_W
  349. assert ival_B.asfreq("D") == ival_B_to_D
  350. assert ival_B.asfreq("H", "S") == ival_B_to_H_start
  351. assert ival_B.asfreq("H", "E") == ival_B_to_H_end
  352. assert ival_B.asfreq("Min", "S") == ival_B_to_T_start
  353. assert ival_B.asfreq("Min", "E") == ival_B_to_T_end
  354. assert ival_B.asfreq("S", "S") == ival_B_to_S_start
  355. assert ival_B.asfreq("S", "E") == ival_B_to_S_end
  356. assert ival_B.asfreq("B") == ival_B
  357. def test_conv_daily(self):
  358. # frequency conversion tests: from Business Frequency"
  359. ival_D = Period(freq="D", year=2007, month=1, day=1)
  360. ival_D_end_of_year = Period(freq="D", year=2007, month=12, day=31)
  361. ival_D_end_of_quarter = Period(freq="D", year=2007, month=3, day=31)
  362. ival_D_end_of_month = Period(freq="D", year=2007, month=1, day=31)
  363. ival_D_end_of_week = Period(freq="D", year=2007, month=1, day=7)
  364. ival_D_friday = Period(freq="D", year=2007, month=1, day=5)
  365. ival_D_saturday = Period(freq="D", year=2007, month=1, day=6)
  366. ival_D_sunday = Period(freq="D", year=2007, month=1, day=7)
  367. ival_B_friday = Period(freq="B", year=2007, month=1, day=5)
  368. ival_B_monday = Period(freq="B", year=2007, month=1, day=8)
  369. ival_D_to_A = Period(freq="A", year=2007)
  370. ival_Deoq_to_AJAN = Period(freq="A-JAN", year=2008)
  371. ival_Deoq_to_AJUN = Period(freq="A-JUN", year=2007)
  372. ival_Deoq_to_ADEC = Period(freq="A-DEC", year=2007)
  373. ival_D_to_QEJAN = Period(freq="Q-JAN", year=2007, quarter=4)
  374. ival_D_to_QEJUN = Period(freq="Q-JUN", year=2007, quarter=3)
  375. ival_D_to_QEDEC = Period(freq="Q-DEC", year=2007, quarter=1)
  376. ival_D_to_M = Period(freq="M", year=2007, month=1)
  377. ival_D_to_W = Period(freq="W", year=2007, month=1, day=7)
  378. ival_D_to_H_start = Period(freq="H", year=2007, month=1, day=1, hour=0)
  379. ival_D_to_H_end = Period(freq="H", year=2007, month=1, day=1, hour=23)
  380. ival_D_to_T_start = Period(
  381. freq="Min", year=2007, month=1, day=1, hour=0, minute=0
  382. )
  383. ival_D_to_T_end = Period(
  384. freq="Min", year=2007, month=1, day=1, hour=23, minute=59
  385. )
  386. ival_D_to_S_start = Period(
  387. freq="S", year=2007, month=1, day=1, hour=0, minute=0, second=0
  388. )
  389. ival_D_to_S_end = Period(
  390. freq="S", year=2007, month=1, day=1, hour=23, minute=59, second=59
  391. )
  392. assert ival_D.asfreq("A") == ival_D_to_A
  393. assert ival_D_end_of_quarter.asfreq("A-JAN") == ival_Deoq_to_AJAN
  394. assert ival_D_end_of_quarter.asfreq("A-JUN") == ival_Deoq_to_AJUN
  395. assert ival_D_end_of_quarter.asfreq("A-DEC") == ival_Deoq_to_ADEC
  396. assert ival_D_end_of_year.asfreq("A") == ival_D_to_A
  397. assert ival_D_end_of_quarter.asfreq("Q") == ival_D_to_QEDEC
  398. assert ival_D.asfreq("Q-JAN") == ival_D_to_QEJAN
  399. assert ival_D.asfreq("Q-JUN") == ival_D_to_QEJUN
  400. assert ival_D.asfreq("Q-DEC") == ival_D_to_QEDEC
  401. assert ival_D.asfreq("M") == ival_D_to_M
  402. assert ival_D_end_of_month.asfreq("M") == ival_D_to_M
  403. assert ival_D.asfreq("W") == ival_D_to_W
  404. assert ival_D_end_of_week.asfreq("W") == ival_D_to_W
  405. assert ival_D_friday.asfreq("B") == ival_B_friday
  406. assert ival_D_saturday.asfreq("B", "S") == ival_B_friday
  407. assert ival_D_saturday.asfreq("B", "E") == ival_B_monday
  408. assert ival_D_sunday.asfreq("B", "S") == ival_B_friday
  409. assert ival_D_sunday.asfreq("B", "E") == ival_B_monday
  410. assert ival_D.asfreq("H", "S") == ival_D_to_H_start
  411. assert ival_D.asfreq("H", "E") == ival_D_to_H_end
  412. assert ival_D.asfreq("Min", "S") == ival_D_to_T_start
  413. assert ival_D.asfreq("Min", "E") == ival_D_to_T_end
  414. assert ival_D.asfreq("S", "S") == ival_D_to_S_start
  415. assert ival_D.asfreq("S", "E") == ival_D_to_S_end
  416. assert ival_D.asfreq("D") == ival_D
  417. def test_conv_hourly(self):
  418. # frequency conversion tests: from Hourly Frequency"
  419. ival_H = Period(freq="H", year=2007, month=1, day=1, hour=0)
  420. ival_H_end_of_year = Period(freq="H", year=2007, month=12, day=31, hour=23)
  421. ival_H_end_of_quarter = Period(freq="H", year=2007, month=3, day=31, hour=23)
  422. ival_H_end_of_month = Period(freq="H", year=2007, month=1, day=31, hour=23)
  423. ival_H_end_of_week = Period(freq="H", year=2007, month=1, day=7, hour=23)
  424. ival_H_end_of_day = Period(freq="H", year=2007, month=1, day=1, hour=23)
  425. ival_H_end_of_bus = Period(freq="H", year=2007, month=1, day=1, hour=23)
  426. ival_H_to_A = Period(freq="A", year=2007)
  427. ival_H_to_Q = Period(freq="Q", year=2007, quarter=1)
  428. ival_H_to_M = Period(freq="M", year=2007, month=1)
  429. ival_H_to_W = Period(freq="W", year=2007, month=1, day=7)
  430. ival_H_to_D = Period(freq="D", year=2007, month=1, day=1)
  431. ival_H_to_B = Period(freq="B", year=2007, month=1, day=1)
  432. ival_H_to_T_start = Period(
  433. freq="Min", year=2007, month=1, day=1, hour=0, minute=0
  434. )
  435. ival_H_to_T_end = Period(
  436. freq="Min", year=2007, month=1, day=1, hour=0, minute=59
  437. )
  438. ival_H_to_S_start = Period(
  439. freq="S", year=2007, month=1, day=1, hour=0, minute=0, second=0
  440. )
  441. ival_H_to_S_end = Period(
  442. freq="S", year=2007, month=1, day=1, hour=0, minute=59, second=59
  443. )
  444. assert ival_H.asfreq("A") == ival_H_to_A
  445. assert ival_H_end_of_year.asfreq("A") == ival_H_to_A
  446. assert ival_H.asfreq("Q") == ival_H_to_Q
  447. assert ival_H_end_of_quarter.asfreq("Q") == ival_H_to_Q
  448. assert ival_H.asfreq("M") == ival_H_to_M
  449. assert ival_H_end_of_month.asfreq("M") == ival_H_to_M
  450. assert ival_H.asfreq("W") == ival_H_to_W
  451. assert ival_H_end_of_week.asfreq("W") == ival_H_to_W
  452. assert ival_H.asfreq("D") == ival_H_to_D
  453. assert ival_H_end_of_day.asfreq("D") == ival_H_to_D
  454. assert ival_H.asfreq("B") == ival_H_to_B
  455. assert ival_H_end_of_bus.asfreq("B") == ival_H_to_B
  456. assert ival_H.asfreq("Min", "S") == ival_H_to_T_start
  457. assert ival_H.asfreq("Min", "E") == ival_H_to_T_end
  458. assert ival_H.asfreq("S", "S") == ival_H_to_S_start
  459. assert ival_H.asfreq("S", "E") == ival_H_to_S_end
  460. assert ival_H.asfreq("H") == ival_H
  461. def test_conv_minutely(self):
  462. # frequency conversion tests: from Minutely Frequency"
  463. ival_T = Period(freq="Min", year=2007, month=1, day=1, hour=0, minute=0)
  464. ival_T_end_of_year = Period(
  465. freq="Min", year=2007, month=12, day=31, hour=23, minute=59
  466. )
  467. ival_T_end_of_quarter = Period(
  468. freq="Min", year=2007, month=3, day=31, hour=23, minute=59
  469. )
  470. ival_T_end_of_month = Period(
  471. freq="Min", year=2007, month=1, day=31, hour=23, minute=59
  472. )
  473. ival_T_end_of_week = Period(
  474. freq="Min", year=2007, month=1, day=7, hour=23, minute=59
  475. )
  476. ival_T_end_of_day = Period(
  477. freq="Min", year=2007, month=1, day=1, hour=23, minute=59
  478. )
  479. ival_T_end_of_bus = Period(
  480. freq="Min", year=2007, month=1, day=1, hour=23, minute=59
  481. )
  482. ival_T_end_of_hour = Period(
  483. freq="Min", year=2007, month=1, day=1, hour=0, minute=59
  484. )
  485. ival_T_to_A = Period(freq="A", year=2007)
  486. ival_T_to_Q = Period(freq="Q", year=2007, quarter=1)
  487. ival_T_to_M = Period(freq="M", year=2007, month=1)
  488. ival_T_to_W = Period(freq="W", year=2007, month=1, day=7)
  489. ival_T_to_D = Period(freq="D", year=2007, month=1, day=1)
  490. ival_T_to_B = Period(freq="B", year=2007, month=1, day=1)
  491. ival_T_to_H = Period(freq="H", year=2007, month=1, day=1, hour=0)
  492. ival_T_to_S_start = Period(
  493. freq="S", year=2007, month=1, day=1, hour=0, minute=0, second=0
  494. )
  495. ival_T_to_S_end = Period(
  496. freq="S", year=2007, month=1, day=1, hour=0, minute=0, second=59
  497. )
  498. assert ival_T.asfreq("A") == ival_T_to_A
  499. assert ival_T_end_of_year.asfreq("A") == ival_T_to_A
  500. assert ival_T.asfreq("Q") == ival_T_to_Q
  501. assert ival_T_end_of_quarter.asfreq("Q") == ival_T_to_Q
  502. assert ival_T.asfreq("M") == ival_T_to_M
  503. assert ival_T_end_of_month.asfreq("M") == ival_T_to_M
  504. assert ival_T.asfreq("W") == ival_T_to_W
  505. assert ival_T_end_of_week.asfreq("W") == ival_T_to_W
  506. assert ival_T.asfreq("D") == ival_T_to_D
  507. assert ival_T_end_of_day.asfreq("D") == ival_T_to_D
  508. assert ival_T.asfreq("B") == ival_T_to_B
  509. assert ival_T_end_of_bus.asfreq("B") == ival_T_to_B
  510. assert ival_T.asfreq("H") == ival_T_to_H
  511. assert ival_T_end_of_hour.asfreq("H") == ival_T_to_H
  512. assert ival_T.asfreq("S", "S") == ival_T_to_S_start
  513. assert ival_T.asfreq("S", "E") == ival_T_to_S_end
  514. assert ival_T.asfreq("Min") == ival_T
  515. def test_conv_secondly(self):
  516. # frequency conversion tests: from Secondly Frequency"
  517. ival_S = Period(freq="S", year=2007, month=1, day=1, hour=0, minute=0, second=0)
  518. ival_S_end_of_year = Period(
  519. freq="S", year=2007, month=12, day=31, hour=23, minute=59, second=59
  520. )
  521. ival_S_end_of_quarter = Period(
  522. freq="S", year=2007, month=3, day=31, hour=23, minute=59, second=59
  523. )
  524. ival_S_end_of_month = Period(
  525. freq="S", year=2007, month=1, day=31, hour=23, minute=59, second=59
  526. )
  527. ival_S_end_of_week = Period(
  528. freq="S", year=2007, month=1, day=7, hour=23, minute=59, second=59
  529. )
  530. ival_S_end_of_day = Period(
  531. freq="S", year=2007, month=1, day=1, hour=23, minute=59, second=59
  532. )
  533. ival_S_end_of_bus = Period(
  534. freq="S", year=2007, month=1, day=1, hour=23, minute=59, second=59
  535. )
  536. ival_S_end_of_hour = Period(
  537. freq="S", year=2007, month=1, day=1, hour=0, minute=59, second=59
  538. )
  539. ival_S_end_of_minute = Period(
  540. freq="S", year=2007, month=1, day=1, hour=0, minute=0, second=59
  541. )
  542. ival_S_to_A = Period(freq="A", year=2007)
  543. ival_S_to_Q = Period(freq="Q", year=2007, quarter=1)
  544. ival_S_to_M = Period(freq="M", year=2007, month=1)
  545. ival_S_to_W = Period(freq="W", year=2007, month=1, day=7)
  546. ival_S_to_D = Period(freq="D", year=2007, month=1, day=1)
  547. ival_S_to_B = Period(freq="B", year=2007, month=1, day=1)
  548. ival_S_to_H = Period(freq="H", year=2007, month=1, day=1, hour=0)
  549. ival_S_to_T = Period(freq="Min", year=2007, month=1, day=1, hour=0, minute=0)
  550. assert ival_S.asfreq("A") == ival_S_to_A
  551. assert ival_S_end_of_year.asfreq("A") == ival_S_to_A
  552. assert ival_S.asfreq("Q") == ival_S_to_Q
  553. assert ival_S_end_of_quarter.asfreq("Q") == ival_S_to_Q
  554. assert ival_S.asfreq("M") == ival_S_to_M
  555. assert ival_S_end_of_month.asfreq("M") == ival_S_to_M
  556. assert ival_S.asfreq("W") == ival_S_to_W
  557. assert ival_S_end_of_week.asfreq("W") == ival_S_to_W
  558. assert ival_S.asfreq("D") == ival_S_to_D
  559. assert ival_S_end_of_day.asfreq("D") == ival_S_to_D
  560. assert ival_S.asfreq("B") == ival_S_to_B
  561. assert ival_S_end_of_bus.asfreq("B") == ival_S_to_B
  562. assert ival_S.asfreq("H") == ival_S_to_H
  563. assert ival_S_end_of_hour.asfreq("H") == ival_S_to_H
  564. assert ival_S.asfreq("Min") == ival_S_to_T
  565. assert ival_S_end_of_minute.asfreq("Min") == ival_S_to_T
  566. assert ival_S.asfreq("S") == ival_S
  567. def test_conv_microsecond(self):
  568. # GH#31475 Avoid floating point errors dropping the start_time to
  569. # before the beginning of the Period
  570. per = Period("2020-01-30 15:57:27.576166", freq="U")
  571. assert per.ordinal == 1580399847576166
  572. start = per.start_time
  573. expected = Timestamp("2020-01-30 15:57:27.576166")
  574. assert start == expected
  575. assert start._value == per.ordinal * 1000
  576. per2 = Period("2300-01-01", "us")
  577. msg = "2300-01-01"
  578. with pytest.raises(OutOfBoundsDatetime, match=msg):
  579. per2.start_time
  580. with pytest.raises(OutOfBoundsDatetime, match=msg):
  581. per2.end_time
  582. def test_asfreq_mult(self):
  583. # normal freq to mult freq
  584. p = Period(freq="A", year=2007)
  585. # ordinal will not change
  586. for freq in ["3A", offsets.YearEnd(3)]:
  587. result = p.asfreq(freq)
  588. expected = Period("2007", freq="3A")
  589. assert result == expected
  590. assert result.ordinal == expected.ordinal
  591. assert result.freq == expected.freq
  592. # ordinal will not change
  593. for freq in ["3A", offsets.YearEnd(3)]:
  594. result = p.asfreq(freq, how="S")
  595. expected = Period("2007", freq="3A")
  596. assert result == expected
  597. assert result.ordinal == expected.ordinal
  598. assert result.freq == expected.freq
  599. # mult freq to normal freq
  600. p = Period(freq="3A", year=2007)
  601. # ordinal will change because how=E is the default
  602. for freq in ["A", offsets.YearEnd()]:
  603. result = p.asfreq(freq)
  604. expected = Period("2009", freq="A")
  605. assert result == expected
  606. assert result.ordinal == expected.ordinal
  607. assert result.freq == expected.freq
  608. # ordinal will not change
  609. for freq in ["A", offsets.YearEnd()]:
  610. result = p.asfreq(freq, how="S")
  611. expected = Period("2007", freq="A")
  612. assert result == expected
  613. assert result.ordinal == expected.ordinal
  614. assert result.freq == expected.freq
  615. p = Period(freq="A", year=2007)
  616. for freq in ["2M", offsets.MonthEnd(2)]:
  617. result = p.asfreq(freq)
  618. expected = Period("2007-12", freq="2M")
  619. assert result == expected
  620. assert result.ordinal == expected.ordinal
  621. assert result.freq == expected.freq
  622. for freq in ["2M", offsets.MonthEnd(2)]:
  623. result = p.asfreq(freq, how="S")
  624. expected = Period("2007-01", freq="2M")
  625. assert result == expected
  626. assert result.ordinal == expected.ordinal
  627. assert result.freq == expected.freq
  628. p = Period(freq="3A", year=2007)
  629. for freq in ["2M", offsets.MonthEnd(2)]:
  630. result = p.asfreq(freq)
  631. expected = Period("2009-12", freq="2M")
  632. assert result == expected
  633. assert result.ordinal == expected.ordinal
  634. assert result.freq == expected.freq
  635. for freq in ["2M", offsets.MonthEnd(2)]:
  636. result = p.asfreq(freq, how="S")
  637. expected = Period("2007-01", freq="2M")
  638. assert result == expected
  639. assert result.ordinal == expected.ordinal
  640. assert result.freq == expected.freq
  641. def test_asfreq_combined(self):
  642. # normal freq to combined freq
  643. p = Period("2007", freq="H")
  644. # ordinal will not change
  645. expected = Period("2007", freq="25H")
  646. for freq, how in zip(["1D1H", "1H1D"], ["E", "S"]):
  647. result = p.asfreq(freq, how=how)
  648. assert result == expected
  649. assert result.ordinal == expected.ordinal
  650. assert result.freq == expected.freq
  651. # combined freq to normal freq
  652. p1 = Period(freq="1D1H", year=2007)
  653. p2 = Period(freq="1H1D", year=2007)
  654. # ordinal will change because how=E is the default
  655. result1 = p1.asfreq("H")
  656. result2 = p2.asfreq("H")
  657. expected = Period("2007-01-02", freq="H")
  658. assert result1 == expected
  659. assert result1.ordinal == expected.ordinal
  660. assert result1.freq == expected.freq
  661. assert result2 == expected
  662. assert result2.ordinal == expected.ordinal
  663. assert result2.freq == expected.freq
  664. # ordinal will not change
  665. result1 = p1.asfreq("H", how="S")
  666. result2 = p2.asfreq("H", how="S")
  667. expected = Period("2007-01-01", freq="H")
  668. assert result1 == expected
  669. assert result1.ordinal == expected.ordinal
  670. assert result1.freq == expected.freq
  671. assert result2 == expected
  672. assert result2.ordinal == expected.ordinal
  673. assert result2.freq == expected.freq
  674. def test_asfreq_MS(self):
  675. initial = Period("2013")
  676. assert initial.asfreq(freq="M", how="S") == Period("2013-01", "M")
  677. msg = INVALID_FREQ_ERR_MSG
  678. with pytest.raises(ValueError, match=msg):
  679. initial.asfreq(freq="MS", how="S")
  680. with pytest.raises(ValueError, match=msg):
  681. Period("2013-01", "MS")
  682. assert _period_code_map.get("MS") is None