test_shift.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. from datetime import datetime
  2. import pytest
  3. import pytz
  4. from pandas.errors import NullFrequencyError
  5. import pandas as pd
  6. from pandas import (
  7. DatetimeIndex,
  8. Series,
  9. date_range,
  10. )
  11. import pandas._testing as tm
  12. START, END = datetime(2009, 1, 1), datetime(2010, 1, 1)
  13. class TestDatetimeIndexShift:
  14. # -------------------------------------------------------------
  15. # DatetimeIndex.shift is used in integer addition
  16. def test_dti_shift_tzaware(self, tz_naive_fixture):
  17. # GH#9903
  18. tz = tz_naive_fixture
  19. idx = DatetimeIndex([], name="xxx", tz=tz)
  20. tm.assert_index_equal(idx.shift(0, freq="H"), idx)
  21. tm.assert_index_equal(idx.shift(3, freq="H"), idx)
  22. idx = DatetimeIndex(
  23. ["2011-01-01 10:00", "2011-01-01 11:00", "2011-01-01 12:00"],
  24. name="xxx",
  25. tz=tz,
  26. freq="H",
  27. )
  28. tm.assert_index_equal(idx.shift(0, freq="H"), idx)
  29. exp = DatetimeIndex(
  30. ["2011-01-01 13:00", "2011-01-01 14:00", "2011-01-01 15:00"],
  31. name="xxx",
  32. tz=tz,
  33. freq="H",
  34. )
  35. tm.assert_index_equal(idx.shift(3, freq="H"), exp)
  36. exp = DatetimeIndex(
  37. ["2011-01-01 07:00", "2011-01-01 08:00", "2011-01-01 09:00"],
  38. name="xxx",
  39. tz=tz,
  40. freq="H",
  41. )
  42. tm.assert_index_equal(idx.shift(-3, freq="H"), exp)
  43. def test_dti_shift_freqs(self):
  44. # test shift for DatetimeIndex and non DatetimeIndex
  45. # GH#8083
  46. drange = date_range("20130101", periods=5)
  47. result = drange.shift(1)
  48. expected = DatetimeIndex(
  49. ["2013-01-02", "2013-01-03", "2013-01-04", "2013-01-05", "2013-01-06"],
  50. freq="D",
  51. )
  52. tm.assert_index_equal(result, expected)
  53. result = drange.shift(-1)
  54. expected = DatetimeIndex(
  55. ["2012-12-31", "2013-01-01", "2013-01-02", "2013-01-03", "2013-01-04"],
  56. freq="D",
  57. )
  58. tm.assert_index_equal(result, expected)
  59. result = drange.shift(3, freq="2D")
  60. expected = DatetimeIndex(
  61. ["2013-01-07", "2013-01-08", "2013-01-09", "2013-01-10", "2013-01-11"],
  62. freq="D",
  63. )
  64. tm.assert_index_equal(result, expected)
  65. def test_dti_shift_int(self):
  66. rng = date_range("1/1/2000", periods=20)
  67. result = rng + 5 * rng.freq
  68. expected = rng.shift(5)
  69. tm.assert_index_equal(result, expected)
  70. result = rng - 5 * rng.freq
  71. expected = rng.shift(-5)
  72. tm.assert_index_equal(result, expected)
  73. def test_dti_shift_no_freq(self):
  74. # GH#19147
  75. dti = DatetimeIndex(["2011-01-01 10:00", "2011-01-01"], freq=None)
  76. with pytest.raises(NullFrequencyError, match="Cannot shift with no freq"):
  77. dti.shift(2)
  78. @pytest.mark.parametrize("tzstr", ["US/Eastern", "dateutil/US/Eastern"])
  79. def test_dti_shift_localized(self, tzstr):
  80. dr = date_range("2011/1/1", "2012/1/1", freq="W-FRI")
  81. dr_tz = dr.tz_localize(tzstr)
  82. result = dr_tz.shift(1, "10T")
  83. assert result.tz == dr_tz.tz
  84. def test_dti_shift_across_dst(self):
  85. # GH 8616
  86. idx = date_range("2013-11-03", tz="America/Chicago", periods=7, freq="H")
  87. s = Series(index=idx[:-1], dtype=object)
  88. result = s.shift(freq="H")
  89. expected = Series(index=idx[1:], dtype=object)
  90. tm.assert_series_equal(result, expected)
  91. @pytest.mark.parametrize(
  92. "shift, result_time",
  93. [
  94. [0, "2014-11-14 00:00:00"],
  95. [-1, "2014-11-13 23:00:00"],
  96. [1, "2014-11-14 01:00:00"],
  97. ],
  98. )
  99. def test_dti_shift_near_midnight(self, shift, result_time):
  100. # GH 8616
  101. dt = datetime(2014, 11, 14, 0)
  102. dt_est = pytz.timezone("EST").localize(dt)
  103. s = Series(data=[1], index=[dt_est])
  104. result = s.shift(shift, freq="H")
  105. expected = Series(1, index=DatetimeIndex([result_time], tz="EST"))
  106. tm.assert_series_equal(result, expected)
  107. def test_shift_periods(self):
  108. # GH#22458 : argument 'n' was deprecated in favor of 'periods'
  109. idx = date_range(start=START, end=END, periods=3)
  110. tm.assert_index_equal(idx.shift(periods=0), idx)
  111. tm.assert_index_equal(idx.shift(0), idx)
  112. @pytest.mark.parametrize("freq", ["B", "C"])
  113. def test_shift_bday(self, freq):
  114. rng = date_range(START, END, freq=freq)
  115. shifted = rng.shift(5)
  116. assert shifted[0] == rng[5]
  117. assert shifted.freq == rng.freq
  118. shifted = rng.shift(-5)
  119. assert shifted[5] == rng[0]
  120. assert shifted.freq == rng.freq
  121. shifted = rng.shift(0)
  122. assert shifted[0] == rng[0]
  123. assert shifted.freq == rng.freq
  124. def test_shift_bmonth(self):
  125. rng = date_range(START, END, freq=pd.offsets.BMonthEnd())
  126. shifted = rng.shift(1, freq=pd.offsets.BDay())
  127. assert shifted[0] == rng[0] + pd.offsets.BDay()
  128. rng = date_range(START, END, freq=pd.offsets.BMonthEnd())
  129. with tm.assert_produces_warning(pd.errors.PerformanceWarning):
  130. shifted = rng.shift(1, freq=pd.offsets.CDay())
  131. assert shifted[0] == rng[0] + pd.offsets.CDay()
  132. def test_shift_empty(self):
  133. # GH#14811
  134. dti = date_range(start="2016-10-21", end="2016-10-21", freq="BM")
  135. result = dti.shift(1)
  136. tm.assert_index_equal(result, dti)