test_period.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. from datetime import timedelta
  2. import numpy as np
  3. import pytest
  4. import pandas as pd
  5. from pandas import (
  6. DataFrame,
  7. DatetimeIndex,
  8. Index,
  9. PeriodIndex,
  10. Timedelta,
  11. date_range,
  12. period_range,
  13. to_datetime,
  14. )
  15. import pandas._testing as tm
  16. def _permute(obj):
  17. return obj.take(np.random.permutation(len(obj)))
  18. class TestPeriodIndex:
  19. def test_as_frame_columns(self):
  20. rng = period_range("1/1/2000", periods=5)
  21. df = DataFrame(np.random.randn(10, 5), columns=rng)
  22. ts = df[rng[0]]
  23. tm.assert_series_equal(ts, df.iloc[:, 0])
  24. # GH # 1211
  25. repr(df)
  26. ts = df["1/1/2000"]
  27. tm.assert_series_equal(ts, df.iloc[:, 0])
  28. def test_frame_setitem(self):
  29. rng = period_range("1/1/2000", periods=5, name="index")
  30. df = DataFrame(np.random.randn(5, 3), index=rng)
  31. df["Index"] = rng
  32. rs = Index(df["Index"])
  33. tm.assert_index_equal(rs, rng, check_names=False)
  34. assert rs.name == "Index"
  35. assert rng.name == "index"
  36. rs = df.reset_index().set_index("index")
  37. assert isinstance(rs.index, PeriodIndex)
  38. tm.assert_index_equal(rs.index, rng)
  39. def test_frame_to_time_stamp(self):
  40. K = 5
  41. index = period_range(freq="A", start="1/1/2001", end="12/1/2009")
  42. df = DataFrame(np.random.randn(len(index), K), index=index)
  43. df["mix"] = "a"
  44. exp_index = date_range("1/1/2001", end="12/31/2009", freq="A-DEC")
  45. exp_index = exp_index + Timedelta(1, "D") - Timedelta(1, "ns")
  46. result = df.to_timestamp("D", "end")
  47. tm.assert_index_equal(result.index, exp_index)
  48. tm.assert_numpy_array_equal(result.values, df.values)
  49. exp_index = date_range("1/1/2001", end="1/1/2009", freq="AS-JAN")
  50. result = df.to_timestamp("D", "start")
  51. tm.assert_index_equal(result.index, exp_index)
  52. def _get_with_delta(delta, freq="A-DEC"):
  53. return date_range(
  54. to_datetime("1/1/2001") + delta,
  55. to_datetime("12/31/2009") + delta,
  56. freq=freq,
  57. )
  58. delta = timedelta(hours=23)
  59. result = df.to_timestamp("H", "end")
  60. exp_index = _get_with_delta(delta)
  61. exp_index = exp_index + Timedelta(1, "h") - Timedelta(1, "ns")
  62. tm.assert_index_equal(result.index, exp_index)
  63. delta = timedelta(hours=23, minutes=59)
  64. result = df.to_timestamp("T", "end")
  65. exp_index = _get_with_delta(delta)
  66. exp_index = exp_index + Timedelta(1, "m") - Timedelta(1, "ns")
  67. tm.assert_index_equal(result.index, exp_index)
  68. result = df.to_timestamp("S", "end")
  69. delta = timedelta(hours=23, minutes=59, seconds=59)
  70. exp_index = _get_with_delta(delta)
  71. exp_index = exp_index + Timedelta(1, "s") - Timedelta(1, "ns")
  72. tm.assert_index_equal(result.index, exp_index)
  73. # columns
  74. df = df.T
  75. exp_index = date_range("1/1/2001", end="12/31/2009", freq="A-DEC")
  76. exp_index = exp_index + Timedelta(1, "D") - Timedelta(1, "ns")
  77. result = df.to_timestamp("D", "end", axis=1)
  78. tm.assert_index_equal(result.columns, exp_index)
  79. tm.assert_numpy_array_equal(result.values, df.values)
  80. exp_index = date_range("1/1/2001", end="1/1/2009", freq="AS-JAN")
  81. result = df.to_timestamp("D", "start", axis=1)
  82. tm.assert_index_equal(result.columns, exp_index)
  83. delta = timedelta(hours=23)
  84. result = df.to_timestamp("H", "end", axis=1)
  85. exp_index = _get_with_delta(delta)
  86. exp_index = exp_index + Timedelta(1, "h") - Timedelta(1, "ns")
  87. tm.assert_index_equal(result.columns, exp_index)
  88. delta = timedelta(hours=23, minutes=59)
  89. result = df.to_timestamp("T", "end", axis=1)
  90. exp_index = _get_with_delta(delta)
  91. exp_index = exp_index + Timedelta(1, "m") - Timedelta(1, "ns")
  92. tm.assert_index_equal(result.columns, exp_index)
  93. result = df.to_timestamp("S", "end", axis=1)
  94. delta = timedelta(hours=23, minutes=59, seconds=59)
  95. exp_index = _get_with_delta(delta)
  96. exp_index = exp_index + Timedelta(1, "s") - Timedelta(1, "ns")
  97. tm.assert_index_equal(result.columns, exp_index)
  98. # invalid axis
  99. with pytest.raises(ValueError, match="axis"):
  100. df.to_timestamp(axis=2)
  101. result1 = df.to_timestamp("5t", axis=1)
  102. result2 = df.to_timestamp("t", axis=1)
  103. expected = pd.date_range("2001-01-01", "2009-01-01", freq="AS")
  104. assert isinstance(result1.columns, DatetimeIndex)
  105. assert isinstance(result2.columns, DatetimeIndex)
  106. tm.assert_numpy_array_equal(result1.columns.asi8, expected.asi8)
  107. tm.assert_numpy_array_equal(result2.columns.asi8, expected.asi8)
  108. # PeriodIndex.to_timestamp always use 'infer'
  109. assert result1.columns.freqstr == "AS-JAN"
  110. assert result2.columns.freqstr == "AS-JAN"
  111. def test_frame_index_to_string(self):
  112. index = PeriodIndex(["2011-1", "2011-2", "2011-3"], freq="M")
  113. frame = DataFrame(np.random.randn(3, 4), index=index)
  114. # it works!
  115. frame.to_string()
  116. def test_align_frame(self):
  117. rng = period_range("1/1/2000", "1/1/2010", freq="A")
  118. ts = DataFrame(np.random.randn(len(rng), 3), index=rng)
  119. result = ts + ts[::2]
  120. expected = ts + ts
  121. expected.values[1::2] = np.nan
  122. tm.assert_frame_equal(result, expected)
  123. result = ts + _permute(ts[::2])
  124. tm.assert_frame_equal(result, expected)