test_timezones.py 7.4 KB

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