test_period_range.py 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import pytest
  2. from pandas import NaT, Period, PeriodIndex, date_range, period_range
  3. import pandas.util.testing as tm
  4. class TestPeriodRange(object):
  5. @pytest.mark.parametrize('freq', ['D', 'W', 'M', 'Q', 'A'])
  6. def test_construction_from_string(self, freq):
  7. # non-empty
  8. expected = date_range(start='2017-01-01', periods=5,
  9. freq=freq, name='foo').to_period()
  10. start, end = str(expected[0]), str(expected[-1])
  11. result = period_range(start=start, end=end, freq=freq, name='foo')
  12. tm.assert_index_equal(result, expected)
  13. result = period_range(start=start, periods=5, freq=freq, name='foo')
  14. tm.assert_index_equal(result, expected)
  15. result = period_range(end=end, periods=5, freq=freq, name='foo')
  16. tm.assert_index_equal(result, expected)
  17. # empty
  18. expected = PeriodIndex([], freq=freq, name='foo')
  19. result = period_range(start=start, periods=0, freq=freq, name='foo')
  20. tm.assert_index_equal(result, expected)
  21. result = period_range(end=end, periods=0, freq=freq, name='foo')
  22. tm.assert_index_equal(result, expected)
  23. result = period_range(start=end, end=start, freq=freq, name='foo')
  24. tm.assert_index_equal(result, expected)
  25. def test_construction_from_period(self):
  26. # upsampling
  27. start, end = Period('2017Q1', freq='Q'), Period('2018Q1', freq='Q')
  28. expected = date_range(start='2017-03-31', end='2018-03-31', freq='M',
  29. name='foo').to_period()
  30. result = period_range(start=start, end=end, freq='M', name='foo')
  31. tm.assert_index_equal(result, expected)
  32. # downsampling
  33. start, end = Period('2017-1', freq='M'), Period('2019-12', freq='M')
  34. expected = date_range(start='2017-01-31', end='2019-12-31', freq='Q',
  35. name='foo').to_period()
  36. result = period_range(start=start, end=end, freq='Q', name='foo')
  37. tm.assert_index_equal(result, expected)
  38. # empty
  39. expected = PeriodIndex([], freq='W', name='foo')
  40. result = period_range(start=start, periods=0, freq='W', name='foo')
  41. tm.assert_index_equal(result, expected)
  42. result = period_range(end=end, periods=0, freq='W', name='foo')
  43. tm.assert_index_equal(result, expected)
  44. result = period_range(start=end, end=start, freq='W', name='foo')
  45. tm.assert_index_equal(result, expected)
  46. def test_errors(self):
  47. # not enough params
  48. msg = ('Of the three parameters: start, end, and periods, '
  49. 'exactly two must be specified')
  50. with pytest.raises(ValueError, match=msg):
  51. period_range(start='2017Q1')
  52. with pytest.raises(ValueError, match=msg):
  53. period_range(end='2017Q1')
  54. with pytest.raises(ValueError, match=msg):
  55. period_range(periods=5)
  56. with pytest.raises(ValueError, match=msg):
  57. period_range()
  58. # too many params
  59. with pytest.raises(ValueError, match=msg):
  60. period_range(start='2017Q1', end='2018Q1', periods=8, freq='Q')
  61. # start/end NaT
  62. msg = 'start and end must not be NaT'
  63. with pytest.raises(ValueError, match=msg):
  64. period_range(start=NaT, end='2018Q1')
  65. with pytest.raises(ValueError, match=msg):
  66. period_range(start='2017Q1', end=NaT)
  67. # invalid periods param
  68. msg = 'periods must be a number, got foo'
  69. with pytest.raises(TypeError, match=msg):
  70. period_range(start='2017Q1', periods='foo')