test_to_period.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import numpy as np
  2. import pytest
  3. from pandas import (
  4. DataFrame,
  5. DatetimeIndex,
  6. PeriodIndex,
  7. Series,
  8. date_range,
  9. period_range,
  10. )
  11. import pandas._testing as tm
  12. class TestToPeriod:
  13. def test_to_period(self, frame_or_series):
  14. K = 5
  15. dr = date_range("1/1/2000", "1/1/2001", freq="D")
  16. obj = DataFrame(
  17. np.random.randn(len(dr), K), index=dr, columns=["A", "B", "C", "D", "E"]
  18. )
  19. obj["mix"] = "a"
  20. obj = tm.get_obj(obj, frame_or_series)
  21. pts = obj.to_period()
  22. exp = obj.copy()
  23. exp.index = period_range("1/1/2000", "1/1/2001")
  24. tm.assert_equal(pts, exp)
  25. pts = obj.to_period("M")
  26. exp.index = exp.index.asfreq("M")
  27. tm.assert_equal(pts, exp)
  28. def test_to_period_without_freq(self, frame_or_series):
  29. # GH#7606 without freq
  30. idx = DatetimeIndex(["2011-01-01", "2011-01-02", "2011-01-03", "2011-01-04"])
  31. exp_idx = PeriodIndex(
  32. ["2011-01-01", "2011-01-02", "2011-01-03", "2011-01-04"], freq="D"
  33. )
  34. obj = DataFrame(np.random.randn(4, 4), index=idx, columns=idx)
  35. obj = tm.get_obj(obj, frame_or_series)
  36. expected = obj.copy()
  37. expected.index = exp_idx
  38. tm.assert_equal(obj.to_period(), expected)
  39. if frame_or_series is DataFrame:
  40. expected = obj.copy()
  41. expected.columns = exp_idx
  42. tm.assert_frame_equal(obj.to_period(axis=1), expected)
  43. def test_to_period_columns(self):
  44. dr = date_range("1/1/2000", "1/1/2001")
  45. df = DataFrame(np.random.randn(len(dr), 5), index=dr)
  46. df["mix"] = "a"
  47. df = df.T
  48. pts = df.to_period(axis=1)
  49. exp = df.copy()
  50. exp.columns = period_range("1/1/2000", "1/1/2001")
  51. tm.assert_frame_equal(pts, exp)
  52. pts = df.to_period("M", axis=1)
  53. tm.assert_index_equal(pts.columns, exp.columns.asfreq("M"))
  54. def test_to_period_invalid_axis(self):
  55. dr = date_range("1/1/2000", "1/1/2001")
  56. df = DataFrame(np.random.randn(len(dr), 5), index=dr)
  57. df["mix"] = "a"
  58. msg = "No axis named 2 for object type DataFrame"
  59. with pytest.raises(ValueError, match=msg):
  60. df.to_period(axis=2)
  61. def test_to_period_raises(self, index, frame_or_series):
  62. # https://github.com/pandas-dev/pandas/issues/33327
  63. obj = Series(index=index, dtype=object)
  64. if frame_or_series is DataFrame:
  65. obj = obj.to_frame()
  66. if not isinstance(index, DatetimeIndex):
  67. msg = f"unsupported Type {type(index).__name__}"
  68. with pytest.raises(TypeError, match=msg):
  69. obj.to_period()