test_period.py 5.4 KB

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