test_arithmetic.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. # -*- coding: utf-8 -*-
  2. from datetime import datetime
  3. import pytest
  4. import pytz
  5. from pandas.errors import NullFrequencyError
  6. import pandas as pd
  7. from pandas import DatetimeIndex, Series, date_range
  8. import pandas.util.testing as tm
  9. class TestDatetimeIndexArithmetic(object):
  10. # -------------------------------------------------------------
  11. # DatetimeIndex.shift is used in integer addition
  12. def test_dti_shift_tzaware(self, tz_naive_fixture):
  13. # GH#9903
  14. tz = tz_naive_fixture
  15. idx = pd.DatetimeIndex([], name='xxx', tz=tz)
  16. tm.assert_index_equal(idx.shift(0, freq='H'), idx)
  17. tm.assert_index_equal(idx.shift(3, freq='H'), idx)
  18. idx = pd.DatetimeIndex(['2011-01-01 10:00', '2011-01-01 11:00',
  19. '2011-01-01 12:00'], name='xxx', tz=tz)
  20. tm.assert_index_equal(idx.shift(0, freq='H'), idx)
  21. exp = pd.DatetimeIndex(['2011-01-01 13:00', '2011-01-01 14:00',
  22. '2011-01-01 15:00'], name='xxx', tz=tz)
  23. tm.assert_index_equal(idx.shift(3, freq='H'), exp)
  24. exp = pd.DatetimeIndex(['2011-01-01 07:00', '2011-01-01 08:00',
  25. '2011-01-01 09:00'], name='xxx', tz=tz)
  26. tm.assert_index_equal(idx.shift(-3, freq='H'), exp)
  27. def test_dti_shift_freqs(self):
  28. # test shift for DatetimeIndex and non DatetimeIndex
  29. # GH#8083
  30. drange = pd.date_range('20130101', periods=5)
  31. result = drange.shift(1)
  32. expected = pd.DatetimeIndex(['2013-01-02', '2013-01-03', '2013-01-04',
  33. '2013-01-05',
  34. '2013-01-06'], freq='D')
  35. tm.assert_index_equal(result, expected)
  36. result = drange.shift(-1)
  37. expected = pd.DatetimeIndex(['2012-12-31', '2013-01-01', '2013-01-02',
  38. '2013-01-03', '2013-01-04'],
  39. freq='D')
  40. tm.assert_index_equal(result, expected)
  41. result = drange.shift(3, freq='2D')
  42. expected = pd.DatetimeIndex(['2013-01-07', '2013-01-08', '2013-01-09',
  43. '2013-01-10',
  44. '2013-01-11'], freq='D')
  45. tm.assert_index_equal(result, expected)
  46. def test_dti_shift_int(self):
  47. rng = date_range('1/1/2000', periods=20)
  48. with tm.assert_produces_warning(FutureWarning, check_stacklevel=False):
  49. # GH#22535
  50. result = rng + 5
  51. expected = rng.shift(5)
  52. tm.assert_index_equal(result, expected)
  53. with tm.assert_produces_warning(FutureWarning, check_stacklevel=False):
  54. # GH#22535
  55. result = rng - 5
  56. expected = rng.shift(-5)
  57. tm.assert_index_equal(result, expected)
  58. def test_dti_shift_no_freq(self):
  59. # GH#19147
  60. dti = pd.DatetimeIndex(['2011-01-01 10:00', '2011-01-01'], freq=None)
  61. with pytest.raises(NullFrequencyError):
  62. dti.shift(2)
  63. @pytest.mark.parametrize('tzstr', ['US/Eastern', 'dateutil/US/Eastern'])
  64. def test_dti_shift_localized(self, tzstr):
  65. dr = date_range('2011/1/1', '2012/1/1', freq='W-FRI')
  66. dr_tz = dr.tz_localize(tzstr)
  67. result = dr_tz.shift(1, '10T')
  68. assert result.tz == dr_tz.tz
  69. def test_dti_shift_across_dst(self):
  70. # GH 8616
  71. idx = date_range('2013-11-03', tz='America/Chicago',
  72. periods=7, freq='H')
  73. s = Series(index=idx[:-1])
  74. result = s.shift(freq='H')
  75. expected = Series(index=idx[1:])
  76. tm.assert_series_equal(result, expected)
  77. @pytest.mark.parametrize('shift, result_time', [
  78. [0, '2014-11-14 00:00:00'],
  79. [-1, '2014-11-13 23:00:00'],
  80. [1, '2014-11-14 01:00:00']])
  81. def test_dti_shift_near_midnight(self, shift, result_time):
  82. # GH 8616
  83. dt = datetime(2014, 11, 14, 0)
  84. dt_est = pytz.timezone('EST').localize(dt)
  85. s = Series(data=[1], index=[dt_est])
  86. result = s.shift(shift, freq='H')
  87. expected = Series(1, index=DatetimeIndex([result_time], tz='EST'))
  88. tm.assert_series_equal(result, expected)