test_timezones.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. """
  2. Tests for DataFrame timezone-related methods
  3. """
  4. from datetime import datetime
  5. import numpy as np
  6. import pytest
  7. import pytz
  8. from pandas.core.dtypes.dtypes import DatetimeTZDtype
  9. import pandas as pd
  10. from pandas import DataFrame, Series
  11. import pandas._testing as tm
  12. from pandas.core.indexes.datetimes import date_range
  13. class TestDataFrameTimezones:
  14. def test_frame_values_with_tz(self):
  15. tz = "US/Central"
  16. df = DataFrame({"A": date_range("2000", periods=4, tz=tz)})
  17. result = df.values
  18. expected = np.array(
  19. [
  20. [pd.Timestamp("2000-01-01", tz=tz)],
  21. [pd.Timestamp("2000-01-02", tz=tz)],
  22. [pd.Timestamp("2000-01-03", tz=tz)],
  23. [pd.Timestamp("2000-01-04", tz=tz)],
  24. ]
  25. )
  26. tm.assert_numpy_array_equal(result, expected)
  27. # two columns, homogenous
  28. df = df.assign(B=df.A)
  29. result = df.values
  30. expected = np.concatenate([expected, expected], axis=1)
  31. tm.assert_numpy_array_equal(result, expected)
  32. # three columns, heterogeneous
  33. est = "US/Eastern"
  34. df = df.assign(C=df.A.dt.tz_convert(est))
  35. new = np.array(
  36. [
  37. [pd.Timestamp("2000-01-01T01:00:00", tz=est)],
  38. [pd.Timestamp("2000-01-02T01:00:00", tz=est)],
  39. [pd.Timestamp("2000-01-03T01:00:00", tz=est)],
  40. [pd.Timestamp("2000-01-04T01:00:00", tz=est)],
  41. ]
  42. )
  43. expected = np.concatenate([expected, new], axis=1)
  44. result = df.values
  45. tm.assert_numpy_array_equal(result, expected)
  46. def test_frame_from_records_utc(self):
  47. rec = {"datum": 1.5, "begin_time": datetime(2006, 4, 27, tzinfo=pytz.utc)}
  48. # it works
  49. DataFrame.from_records([rec], index="begin_time")
  50. def test_frame_tz_localize(self):
  51. rng = date_range("1/1/2011", periods=100, freq="H")
  52. df = DataFrame({"a": 1}, index=rng)
  53. result = df.tz_localize("utc")
  54. expected = DataFrame({"a": 1}, rng.tz_localize("UTC"))
  55. assert result.index.tz.zone == "UTC"
  56. tm.assert_frame_equal(result, expected)
  57. df = df.T
  58. result = df.tz_localize("utc", axis=1)
  59. assert result.columns.tz.zone == "UTC"
  60. tm.assert_frame_equal(result, expected.T)
  61. def test_frame_tz_convert(self):
  62. rng = date_range("1/1/2011", periods=200, freq="D", tz="US/Eastern")
  63. df = DataFrame({"a": 1}, index=rng)
  64. result = df.tz_convert("Europe/Berlin")
  65. expected = DataFrame({"a": 1}, rng.tz_convert("Europe/Berlin"))
  66. assert result.index.tz.zone == "Europe/Berlin"
  67. tm.assert_frame_equal(result, expected)
  68. df = df.T
  69. result = df.tz_convert("Europe/Berlin", axis=1)
  70. assert result.columns.tz.zone == "Europe/Berlin"
  71. tm.assert_frame_equal(result, expected.T)
  72. def test_frame_join_tzaware(self):
  73. test1 = DataFrame(
  74. np.zeros((6, 3)),
  75. index=date_range(
  76. "2012-11-15 00:00:00", periods=6, freq="100L", tz="US/Central"
  77. ),
  78. )
  79. test2 = DataFrame(
  80. np.zeros((3, 3)),
  81. index=date_range(
  82. "2012-11-15 00:00:00", periods=3, freq="250L", tz="US/Central"
  83. ),
  84. columns=range(3, 6),
  85. )
  86. result = test1.join(test2, how="outer")
  87. ex_index = test1.index.union(test2.index)
  88. tm.assert_index_equal(result.index, ex_index)
  89. assert result.index.tz.zone == "US/Central"
  90. def test_frame_add_tz_mismatch_converts_to_utc(self):
  91. rng = date_range("1/1/2011", periods=10, freq="H", tz="US/Eastern")
  92. df = DataFrame(np.random.randn(len(rng)), index=rng, columns=["a"])
  93. df_moscow = df.tz_convert("Europe/Moscow")
  94. result = df + df_moscow
  95. assert result.index.tz is pytz.utc
  96. result = df_moscow + df
  97. assert result.index.tz is pytz.utc
  98. def test_frame_align_aware(self):
  99. idx1 = date_range("2001", periods=5, freq="H", tz="US/Eastern")
  100. idx2 = date_range("2001", periods=5, freq="2H", tz="US/Eastern")
  101. df1 = DataFrame(np.random.randn(len(idx1), 3), idx1)
  102. df2 = DataFrame(np.random.randn(len(idx2), 3), idx2)
  103. new1, new2 = df1.align(df2)
  104. assert df1.index.tz == new1.index.tz
  105. assert df2.index.tz == new2.index.tz
  106. # different timezones convert to UTC
  107. # frame with frame
  108. df1_central = df1.tz_convert("US/Central")
  109. new1, new2 = df1.align(df1_central)
  110. assert new1.index.tz == pytz.UTC
  111. assert new2.index.tz == pytz.UTC
  112. # frame with Series
  113. new1, new2 = df1.align(df1_central[0], axis=0)
  114. assert new1.index.tz == pytz.UTC
  115. assert new2.index.tz == pytz.UTC
  116. df1[0].align(df1_central, axis=0)
  117. assert new1.index.tz == pytz.UTC
  118. assert new2.index.tz == pytz.UTC
  119. @pytest.mark.parametrize("tz", ["US/Eastern", "dateutil/US/Eastern"])
  120. def test_frame_no_datetime64_dtype(self, tz):
  121. # after GH#7822
  122. # these retain the timezones on dict construction
  123. dr = date_range("2011/1/1", "2012/1/1", freq="W-FRI")
  124. dr_tz = dr.tz_localize(tz)
  125. df = DataFrame({"A": "foo", "B": dr_tz}, index=dr)
  126. tz_expected = DatetimeTZDtype("ns", dr_tz.tzinfo)
  127. assert df["B"].dtype == tz_expected
  128. # GH#2810 (with timezones)
  129. datetimes_naive = [ts.to_pydatetime() for ts in dr]
  130. datetimes_with_tz = [ts.to_pydatetime() for ts in dr_tz]
  131. df = DataFrame({"dr": dr})
  132. df["dr_tz"] = dr_tz
  133. df["datetimes_naive"] = datetimes_naive
  134. df["datetimes_with_tz"] = datetimes_with_tz
  135. result = df.dtypes
  136. expected = Series(
  137. [
  138. np.dtype("datetime64[ns]"),
  139. DatetimeTZDtype(tz=tz),
  140. np.dtype("datetime64[ns]"),
  141. DatetimeTZDtype(tz=tz),
  142. ],
  143. index=["dr", "dr_tz", "datetimes_naive", "datetimes_with_tz"],
  144. )
  145. tm.assert_series_equal(result, expected)
  146. @pytest.mark.parametrize("tz", ["US/Eastern", "dateutil/US/Eastern"])
  147. def test_frame_reset_index(self, tz):
  148. dr = date_range("2012-06-02", periods=10, tz=tz)
  149. df = DataFrame(np.random.randn(len(dr)), dr)
  150. roundtripped = df.reset_index().set_index("index")
  151. xp = df.index.tz
  152. rs = roundtripped.index.tz
  153. assert xp == rs
  154. @pytest.mark.parametrize("tz", [None, "America/New_York"])
  155. def test_boolean_compare_transpose_tzindex_with_dst(self, tz):
  156. # GH 19970
  157. idx = date_range("20161101", "20161130", freq="4H", tz=tz)
  158. df = DataFrame({"a": range(len(idx)), "b": range(len(idx))}, index=idx)
  159. result = df.T == df.T
  160. expected = DataFrame(True, index=list("ab"), columns=idx)
  161. tm.assert_frame_equal(result, expected)
  162. @pytest.mark.parametrize("copy", [True, False])
  163. @pytest.mark.parametrize(
  164. "method, tz", [["tz_localize", None], ["tz_convert", "Europe/Berlin"]]
  165. )
  166. def test_tz_localize_convert_copy_inplace_mutate(self, copy, method, tz):
  167. # GH 6326
  168. result = DataFrame(
  169. np.arange(0, 5), index=date_range("20131027", periods=5, freq="1H", tz=tz)
  170. )
  171. getattr(result, method)("UTC", copy=copy)
  172. expected = DataFrame(
  173. np.arange(0, 5), index=date_range("20131027", periods=5, freq="1H", tz=tz)
  174. )
  175. tm.assert_frame_equal(result, expected)
  176. def test_constructor_data_aware_dtype_naive(self, tz_aware_fixture):
  177. # GH 25843
  178. tz = tz_aware_fixture
  179. result = DataFrame({"d": [pd.Timestamp("2019", tz=tz)]}, dtype="datetime64[ns]")
  180. expected = DataFrame({"d": [pd.Timestamp("2019")]})
  181. tm.assert_frame_equal(result, expected)