test_tz_convert.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import numpy as np
  2. import pytest
  3. from pandas import (
  4. DataFrame,
  5. Index,
  6. MultiIndex,
  7. Series,
  8. date_range,
  9. )
  10. import pandas._testing as tm
  11. class TestTZConvert:
  12. def test_tz_convert(self, frame_or_series):
  13. rng = date_range("1/1/2011", periods=200, freq="D", tz="US/Eastern")
  14. obj = DataFrame({"a": 1}, index=rng)
  15. obj = tm.get_obj(obj, frame_or_series)
  16. result = obj.tz_convert("Europe/Berlin")
  17. expected = DataFrame({"a": 1}, rng.tz_convert("Europe/Berlin"))
  18. expected = tm.get_obj(expected, frame_or_series)
  19. assert result.index.tz.zone == "Europe/Berlin"
  20. tm.assert_equal(result, expected)
  21. def test_tz_convert_axis1(self):
  22. rng = date_range("1/1/2011", periods=200, freq="D", tz="US/Eastern")
  23. obj = DataFrame({"a": 1}, index=rng)
  24. obj = obj.T
  25. result = obj.tz_convert("Europe/Berlin", axis=1)
  26. assert result.columns.tz.zone == "Europe/Berlin"
  27. expected = DataFrame({"a": 1}, rng.tz_convert("Europe/Berlin"))
  28. tm.assert_equal(result, expected.T)
  29. def test_tz_convert_naive(self, frame_or_series):
  30. # can't convert tz-naive
  31. rng = date_range("1/1/2011", periods=200, freq="D")
  32. ts = Series(1, index=rng)
  33. ts = frame_or_series(ts)
  34. with pytest.raises(TypeError, match="Cannot convert tz-naive"):
  35. ts.tz_convert("US/Eastern")
  36. @pytest.mark.parametrize("fn", ["tz_localize", "tz_convert"])
  37. def test_tz_convert_and_localize(self, fn):
  38. l0 = date_range("20140701", periods=5, freq="D")
  39. l1 = date_range("20140701", periods=5, freq="D")
  40. int_idx = Index(range(5))
  41. if fn == "tz_convert":
  42. l0 = l0.tz_localize("UTC")
  43. l1 = l1.tz_localize("UTC")
  44. for idx in [l0, l1]:
  45. l0_expected = getattr(idx, fn)("US/Pacific")
  46. l1_expected = getattr(idx, fn)("US/Pacific")
  47. df1 = DataFrame(np.ones(5), index=l0)
  48. df1 = getattr(df1, fn)("US/Pacific")
  49. tm.assert_index_equal(df1.index, l0_expected)
  50. # MultiIndex
  51. # GH7846
  52. df2 = DataFrame(np.ones(5), MultiIndex.from_arrays([l0, l1]))
  53. # freq is not preserved in MultiIndex construction
  54. l1_expected = l1_expected._with_freq(None)
  55. l0_expected = l0_expected._with_freq(None)
  56. l1 = l1._with_freq(None)
  57. l0 = l0._with_freq(None)
  58. df3 = getattr(df2, fn)("US/Pacific", level=0)
  59. assert not df3.index.levels[0].equals(l0)
  60. tm.assert_index_equal(df3.index.levels[0], l0_expected)
  61. tm.assert_index_equal(df3.index.levels[1], l1)
  62. assert not df3.index.levels[1].equals(l1_expected)
  63. df3 = getattr(df2, fn)("US/Pacific", level=1)
  64. tm.assert_index_equal(df3.index.levels[0], l0)
  65. assert not df3.index.levels[0].equals(l0_expected)
  66. tm.assert_index_equal(df3.index.levels[1], l1_expected)
  67. assert not df3.index.levels[1].equals(l1)
  68. df4 = DataFrame(np.ones(5), MultiIndex.from_arrays([int_idx, l0]))
  69. # TODO: untested
  70. df5 = getattr(df4, fn)("US/Pacific", level=1) # noqa
  71. tm.assert_index_equal(df3.index.levels[0], l0)
  72. assert not df3.index.levels[0].equals(l0_expected)
  73. tm.assert_index_equal(df3.index.levels[1], l1_expected)
  74. assert not df3.index.levels[1].equals(l1)
  75. # Bad Inputs
  76. # Not DatetimeIndex / PeriodIndex
  77. with pytest.raises(TypeError, match="DatetimeIndex"):
  78. df = DataFrame(index=int_idx)
  79. getattr(df, fn)("US/Pacific")
  80. # Not DatetimeIndex / PeriodIndex
  81. with pytest.raises(TypeError, match="DatetimeIndex"):
  82. df = DataFrame(np.ones(5), MultiIndex.from_arrays([int_idx, l0]))
  83. getattr(df, fn)("US/Pacific", level=0)
  84. # Invalid level
  85. with pytest.raises(ValueError, match="not valid"):
  86. df = DataFrame(index=l0)
  87. getattr(df, fn)("US/Pacific", level=1)
  88. @pytest.mark.parametrize("copy", [True, False])
  89. def test_tz_convert_copy_inplace_mutate(self, copy, frame_or_series):
  90. # GH#6326
  91. obj = frame_or_series(
  92. np.arange(0, 5),
  93. index=date_range("20131027", periods=5, freq="1H", tz="Europe/Berlin"),
  94. )
  95. orig = obj.copy()
  96. result = obj.tz_convert("UTC", copy=copy)
  97. expected = frame_or_series(np.arange(0, 5), index=obj.index.tz_convert("UTC"))
  98. tm.assert_equal(result, expected)
  99. tm.assert_equal(obj, orig)
  100. assert result.index is not obj.index
  101. assert result is not obj