PageRenderTime 59ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/pandas/tseries/tests/test_timezones.py

http://github.com/pydata/pandas
Python | 1140 lines | 776 code | 280 blank | 84 comment | 22 complexity | 4d2b22da7d6c60a4d1ce4e0bc0547ea7 MD5 | raw file
Possible License(s): BSD-3-Clause, Apache-2.0
  1. # pylint: disable-msg=E1101,W0612
  2. from datetime import datetime, timedelta, tzinfo, date
  3. import sys
  4. import os
  5. import nose
  6. import numpy as np
  7. import pytz
  8. from pandas import (Index, Series, DataFrame, isnull, Timestamp)
  9. from pandas import DatetimeIndex, to_datetime, NaT
  10. from pandas import tslib
  11. import pandas.core.datetools as datetools
  12. import pandas.tseries.offsets as offsets
  13. from pandas.tseries.index import bdate_range, date_range
  14. import pandas.tseries.tools as tools
  15. from pytz import NonExistentTimeError
  16. import pandas.util.testing as tm
  17. from pandas.util.testing import assert_frame_equal
  18. from pandas.compat import lrange, zip
  19. from pandas import _np_version_under1p7
  20. try:
  21. import pytz
  22. except ImportError:
  23. pass
  24. try:
  25. import dateutil
  26. except ImportError:
  27. pass
  28. class FixedOffset(tzinfo):
  29. """Fixed offset in minutes east from UTC."""
  30. def __init__(self, offset, name):
  31. self.__offset = timedelta(minutes=offset)
  32. self.__name = name
  33. def utcoffset(self, dt):
  34. return self.__offset
  35. def tzname(self, dt):
  36. return self.__name
  37. def dst(self, dt):
  38. return timedelta(0)
  39. fixed_off = FixedOffset(-420, '-07:00')
  40. fixed_off_no_name = FixedOffset(-330, None)
  41. class TestTimeZoneSupportPytz(tm.TestCase):
  42. _multiprocess_can_split_ = True
  43. def setUp(self):
  44. tm._skip_if_no_pytz()
  45. def tz(self, tz):
  46. ''' Construct a timezone object from a string. Overridden in subclass to parameterize tests. '''
  47. return pytz.timezone(tz)
  48. def tzstr(self, tz):
  49. ''' Construct a timezone string from a string. Overridden in subclass to parameterize tests. '''
  50. return tz
  51. def localize(self, tz, x):
  52. return tz.localize(x)
  53. def cmptz(self, tz1, tz2):
  54. ''' Compare two timezones. Overridden in subclass to parameterize tests. '''
  55. return tz1.zone == tz2.zone
  56. def test_utc_to_local_no_modify(self):
  57. rng = date_range('3/11/2012', '3/12/2012', freq='H', tz='utc')
  58. rng_eastern = rng.tz_convert(self.tzstr('US/Eastern'))
  59. # Values are unmodified
  60. self.assert_(np.array_equal(rng.asi8, rng_eastern.asi8))
  61. self.assert_(self.cmptz(rng_eastern.tz, self.tz('US/Eastern')))
  62. def test_utc_to_local_no_modify_explicit(self):
  63. rng = date_range('3/11/2012', '3/12/2012', freq='H', tz='utc')
  64. rng_eastern = rng.tz_convert(self.tz('US/Eastern'))
  65. # Values are unmodified
  66. self.assert_numpy_array_equal(rng.asi8, rng_eastern.asi8)
  67. self.assertEqual(rng_eastern.tz, self.tz('US/Eastern'))
  68. def test_localize_utc_conversion(self):
  69. # Localizing to time zone should:
  70. # 1) check for DST ambiguities
  71. # 2) convert to UTC
  72. rng = date_range('3/10/2012', '3/11/2012', freq='30T')
  73. converted = rng.tz_localize(self.tzstr('US/Eastern'))
  74. expected_naive = rng + offsets.Hour(5)
  75. self.assert_numpy_array_equal(converted.asi8, expected_naive.asi8)
  76. # DST ambiguity, this should fail
  77. rng = date_range('3/11/2012', '3/12/2012', freq='30T')
  78. # Is this really how it should fail??
  79. self.assertRaises(NonExistentTimeError, rng.tz_localize, self.tzstr('US/Eastern'))
  80. def test_localize_utc_conversion_explicit(self):
  81. # Localizing to time zone should:
  82. # 1) check for DST ambiguities
  83. # 2) convert to UTC
  84. rng = date_range('3/10/2012', '3/11/2012', freq='30T')
  85. converted = rng.tz_localize(self.tz('US/Eastern'))
  86. expected_naive = rng + offsets.Hour(5)
  87. self.assert_(np.array_equal(converted.asi8, expected_naive.asi8))
  88. # DST ambiguity, this should fail
  89. rng = date_range('3/11/2012', '3/12/2012', freq='30T')
  90. # Is this really how it should fail??
  91. self.assertRaises(NonExistentTimeError, rng.tz_localize, self.tz('US/Eastern'))
  92. def test_timestamp_tz_localize(self):
  93. stamp = Timestamp('3/11/2012 04:00')
  94. result = stamp.tz_localize(self.tzstr('US/Eastern'))
  95. expected = Timestamp('3/11/2012 04:00', tz=self.tzstr('US/Eastern'))
  96. self.assertEqual(result.hour, expected.hour)
  97. self.assertEqual(result, expected)
  98. def test_timestamp_tz_localize_explicit(self):
  99. stamp = Timestamp('3/11/2012 04:00')
  100. result = stamp.tz_localize(self.tz('US/Eastern'))
  101. expected = Timestamp('3/11/2012 04:00', tz=self.tz('US/Eastern'))
  102. self.assertEqual(result.hour, expected.hour)
  103. self.assertEqual(result, expected)
  104. def test_timestamp_constructed_by_date_and_tz(self):
  105. # Fix Issue 2993, Timestamp cannot be constructed by datetime.date
  106. # and tz correctly
  107. result = Timestamp(date(2012, 3, 11), tz=self.tzstr('US/Eastern'))
  108. expected = Timestamp('3/11/2012', tz=self.tzstr('US/Eastern'))
  109. self.assertEqual(result.hour, expected.hour)
  110. self.assertEqual(result, expected)
  111. def test_timestamp_constructed_by_date_and_tz_explicit(self):
  112. # Fix Issue 2993, Timestamp cannot be constructed by datetime.date
  113. # and tz correctly
  114. result = Timestamp(date(2012, 3, 11), tz=self.tz('US/Eastern'))
  115. expected = Timestamp('3/11/2012', tz=self.tz('US/Eastern'))
  116. self.assertEquals(result.hour, expected.hour)
  117. self.assertEquals(result, expected)
  118. def test_timestamp_to_datetime_tzoffset(self):
  119. # tzoffset
  120. from dateutil.tz import tzoffset
  121. tzinfo = tzoffset(None, 7200)
  122. expected = Timestamp('3/11/2012 04:00', tz=tzinfo)
  123. result = Timestamp(expected.to_datetime())
  124. self.assertEqual(expected, result)
  125. def test_timedelta_push_over_dst_boundary(self):
  126. # #1389
  127. # 4 hours before DST transition
  128. stamp = Timestamp('3/10/2012 22:00', tz=self.tzstr('US/Eastern'))
  129. result = stamp + timedelta(hours=6)
  130. # spring forward, + "7" hours
  131. expected = Timestamp('3/11/2012 05:00', tz=self.tzstr('US/Eastern'))
  132. self.assertEquals(result, expected)
  133. def test_timedelta_push_over_dst_boundary_explicit(self):
  134. # #1389
  135. # 4 hours before DST transition
  136. stamp = Timestamp('3/10/2012 22:00', tz=self.tz('US/Eastern'))
  137. result = stamp + timedelta(hours=6)
  138. # spring forward, + "7" hours
  139. expected = Timestamp('3/11/2012 05:00', tz=self.tz('US/Eastern'))
  140. self.assertEqual(result, expected)
  141. def test_tz_localize_dti(self):
  142. from pandas.tseries.offsets import Hour
  143. dti = DatetimeIndex(start='1/1/2005', end='1/1/2005 0:00:30.256',
  144. freq='L')
  145. dti2 = dti.tz_localize(self.tzstr('US/Eastern'))
  146. dti_utc = DatetimeIndex(start='1/1/2005 05:00',
  147. end='1/1/2005 5:00:30.256', freq='L',
  148. tz='utc')
  149. self.assert_numpy_array_equal(dti2.values, dti_utc.values)
  150. dti3 = dti2.tz_convert(self.tzstr('US/Pacific'))
  151. self.assert_numpy_array_equal(dti3.values, dti_utc.values)
  152. dti = DatetimeIndex(start='11/6/2011 1:59',
  153. end='11/6/2011 2:00', freq='L')
  154. self.assertRaises(pytz.AmbiguousTimeError, dti.tz_localize,
  155. self.tzstr('US/Eastern'))
  156. dti = DatetimeIndex(start='3/13/2011 1:59', end='3/13/2011 2:00',
  157. freq='L')
  158. self.assertRaises(
  159. pytz.NonExistentTimeError, dti.tz_localize, self.tzstr('US/Eastern'))
  160. def test_tz_localize_empty_series(self):
  161. # #2248
  162. ts = Series()
  163. ts2 = ts.tz_localize('utc')
  164. self.assertTrue(ts2.index.tz == pytz.utc)
  165. ts2 = ts.tz_localize(self.tzstr('US/Eastern'))
  166. self.assertTrue(self.cmptz(ts2.index.tz, self.tz('US/Eastern')))
  167. def test_astimezone(self):
  168. utc = Timestamp('3/11/2012 22:00', tz='UTC')
  169. expected = utc.tz_convert(self.tzstr('US/Eastern'))
  170. result = utc.astimezone(self.tzstr('US/Eastern'))
  171. self.assertEqual(expected, result)
  172. tm.assert_isinstance(result, Timestamp)
  173. def test_create_with_tz(self):
  174. stamp = Timestamp('3/11/2012 05:00', tz=self.tzstr('US/Eastern'))
  175. self.assertEqual(stamp.hour, 5)
  176. rng = date_range(
  177. '3/11/2012 04:00', periods=10, freq='H', tz=self.tzstr('US/Eastern'))
  178. self.assertEqual(stamp, rng[1])
  179. utc_stamp = Timestamp('3/11/2012 05:00', tz='utc')
  180. self.assertIs(utc_stamp.tzinfo, pytz.utc)
  181. self.assertEqual(utc_stamp.hour, 5)
  182. stamp = Timestamp('3/11/2012 05:00').tz_localize('utc')
  183. self.assertEqual(utc_stamp.hour, 5)
  184. def test_create_with_fixed_tz(self):
  185. off = FixedOffset(420, '+07:00')
  186. start = datetime(2012, 3, 11, 5, 0, 0, tzinfo=off)
  187. end = datetime(2012, 6, 11, 5, 0, 0, tzinfo=off)
  188. rng = date_range(start=start, end=end)
  189. self.assertEqual(off, rng.tz)
  190. rng2 = date_range(start, periods=len(rng), tz=off)
  191. self.assertTrue(rng.equals(rng2))
  192. rng3 = date_range(
  193. '3/11/2012 05:00:00+07:00', '6/11/2012 05:00:00+07:00')
  194. self.assertTrue((rng.values == rng3.values).all())
  195. def test_create_with_fixedoffset_noname(self):
  196. off = fixed_off_no_name
  197. start = datetime(2012, 3, 11, 5, 0, 0, tzinfo=off)
  198. end = datetime(2012, 6, 11, 5, 0, 0, tzinfo=off)
  199. rng = date_range(start=start, end=end)
  200. self.assertEqual(off, rng.tz)
  201. idx = Index([start, end])
  202. self.assertEqual(off, idx.tz)
  203. def test_date_range_localize(self):
  204. rng = date_range(
  205. '3/11/2012 03:00', periods=15, freq='H', tz='US/Eastern')
  206. rng2 = DatetimeIndex(['3/11/2012 03:00', '3/11/2012 04:00'],
  207. tz='US/Eastern')
  208. rng3 = date_range('3/11/2012 03:00', periods=15, freq='H')
  209. rng3 = rng3.tz_localize('US/Eastern')
  210. self.assertTrue(rng.equals(rng3))
  211. # DST transition time
  212. val = rng[0]
  213. exp = Timestamp('3/11/2012 03:00', tz='US/Eastern')
  214. self.assertEqual(val.hour, 3)
  215. self.assertEqual(exp.hour, 3)
  216. self.assertEqual(val, exp) # same UTC value
  217. self.assertTrue(rng[:2].equals(rng2))
  218. # Right before the DST transition
  219. rng = date_range(
  220. '3/11/2012 00:00', periods=2, freq='H', tz='US/Eastern')
  221. rng2 = DatetimeIndex(['3/11/2012 00:00', '3/11/2012 01:00'],
  222. tz='US/Eastern')
  223. self.assertTrue(rng.equals(rng2))
  224. exp = Timestamp('3/11/2012 00:00', tz='US/Eastern')
  225. self.assertEqual(exp.hour, 0)
  226. self.assertEqual(rng[0], exp)
  227. exp = Timestamp('3/11/2012 01:00', tz='US/Eastern')
  228. self.assertEqual(exp.hour, 1)
  229. self.assertEqual(rng[1], exp)
  230. rng = date_range('3/11/2012 00:00', periods=10, freq='H',
  231. tz='US/Eastern')
  232. self.assertEqual(rng[2].hour, 3)
  233. def test_utc_box_timestamp_and_localize(self):
  234. rng = date_range('3/11/2012', '3/12/2012', freq='H', tz='utc')
  235. rng_eastern = rng.tz_convert(self.tzstr('US/Eastern'))
  236. tz = self.tz('US/Eastern')
  237. expected = rng[-1].astimezone(tz)
  238. stamp = rng_eastern[-1]
  239. self.assertEqual(stamp, expected)
  240. self.assertEqual(stamp.tzinfo, expected.tzinfo)
  241. # right tzinfo
  242. rng = date_range('3/13/2012', '3/14/2012', freq='H', tz='utc')
  243. rng_eastern = rng.tz_convert(self.tzstr('US/Eastern'))
  244. # test not valid for dateutil timezones.
  245. # self.assertIn('EDT', repr(rng_eastern[0].tzinfo))
  246. self.assert_('EDT' in repr(rng_eastern[0].tzinfo) or 'tzfile' in repr(rng_eastern[0].tzinfo))
  247. def test_timestamp_tz_convert(self):
  248. strdates = ['1/1/2012', '3/1/2012', '4/1/2012']
  249. idx = DatetimeIndex(strdates, tz=self.tzstr('US/Eastern'))
  250. conv = idx[0].tz_convert(self.tzstr('US/Pacific'))
  251. expected = idx.tz_convert(self.tzstr('US/Pacific'))[0]
  252. self.assertEqual(conv, expected)
  253. def test_pass_dates_localize_to_utc(self):
  254. strdates = ['1/1/2012', '3/1/2012', '4/1/2012']
  255. idx = DatetimeIndex(strdates)
  256. conv = idx.tz_localize(self.tzstr('US/Eastern'))
  257. fromdates = DatetimeIndex(strdates, tz=self.tzstr('US/Eastern'))
  258. self.assertEqual(conv.tz, fromdates.tz)
  259. self.assert_numpy_array_equal(conv.values, fromdates.values)
  260. def test_field_access_localize(self):
  261. strdates = ['1/1/2012', '3/1/2012', '4/1/2012']
  262. rng = DatetimeIndex(strdates, tz=self.tzstr('US/Eastern'))
  263. self.assertTrue((rng.hour == 0).all())
  264. # a more unusual time zone, #1946
  265. dr = date_range('2011-10-02 00:00', freq='h', periods=10,
  266. tz=self.tzstr('America/Atikokan'))
  267. expected = np.arange(10)
  268. self.assert_numpy_array_equal(dr.hour, expected)
  269. def test_with_tz(self):
  270. tz = self.tz('US/Central')
  271. # just want it to work
  272. start = datetime(2011, 3, 12, tzinfo=pytz.utc)
  273. dr = bdate_range(start, periods=50, freq=datetools.Hour())
  274. self.assertIs(dr.tz, pytz.utc)
  275. # DateRange with naive datetimes
  276. dr = bdate_range('1/1/2005', '1/1/2009', tz=pytz.utc)
  277. dr = bdate_range('1/1/2005', '1/1/2009', tz=tz)
  278. # normalized
  279. central = dr.tz_convert(tz)
  280. self.assertIs(central.tz, tz)
  281. comp = self.localize(tz, central[0].to_pydatetime().replace(tzinfo=None)).tzinfo
  282. self.assertIs(central[0].tz, comp)
  283. # compare vs a localized tz
  284. comp = self.localize(tz, dr[0].to_pydatetime().replace(tzinfo=None)).tzinfo
  285. self.assertIs(central[0].tz, comp)
  286. # datetimes with tzinfo set
  287. dr = bdate_range(datetime(2005, 1, 1, tzinfo=pytz.utc),
  288. '1/1/2009', tz=pytz.utc)
  289. self.assertRaises(Exception, bdate_range,
  290. datetime(2005, 1, 1, tzinfo=pytz.utc),
  291. '1/1/2009', tz=tz)
  292. def test_tz_localize(self):
  293. dr = bdate_range('1/1/2009', '1/1/2010')
  294. dr_utc = bdate_range('1/1/2009', '1/1/2010', tz=pytz.utc)
  295. localized = dr.tz_localize(pytz.utc)
  296. self.assert_numpy_array_equal(dr_utc, localized)
  297. def test_with_tz_ambiguous_times(self):
  298. tz = self.tz('US/Eastern')
  299. # March 13, 2011, spring forward, skip from 2 AM to 3 AM
  300. dr = date_range(datetime(2011, 3, 13, 1, 30), periods=3,
  301. freq=datetools.Hour())
  302. self.assertRaises(pytz.NonExistentTimeError, dr.tz_localize, tz)
  303. # after dst transition, it works
  304. dr = date_range(datetime(2011, 3, 13, 3, 30), periods=3,
  305. freq=datetools.Hour(), tz=tz)
  306. # November 6, 2011, fall back, repeat 2 AM hour
  307. dr = date_range(datetime(2011, 11, 6, 1, 30), periods=3,
  308. freq=datetools.Hour())
  309. self.assertRaises(pytz.AmbiguousTimeError, dr.tz_localize, tz)
  310. # UTC is OK
  311. dr = date_range(datetime(2011, 3, 13), periods=48,
  312. freq=datetools.Minute(30), tz=pytz.utc)
  313. def test_infer_dst(self):
  314. # November 6, 2011, fall back, repeat 2 AM hour
  315. # With no repeated hours, we cannot infer the transition
  316. tz = self.tz('US/Eastern')
  317. dr = date_range(datetime(2011, 11, 6, 0), periods=5,
  318. freq=datetools.Hour())
  319. self.assertRaises(pytz.AmbiguousTimeError, dr.tz_localize,
  320. tz, infer_dst=True)
  321. # With repeated hours, we can infer the transition
  322. dr = date_range(datetime(2011, 11, 6, 0), periods=5,
  323. freq=datetools.Hour(), tz=tz)
  324. di = DatetimeIndex(['11/06/2011 00:00', '11/06/2011 01:00',
  325. '11/06/2011 01:00', '11/06/2011 02:00',
  326. '11/06/2011 03:00'])
  327. localized = di.tz_localize(tz, infer_dst=True)
  328. self.assert_numpy_array_equal(dr, localized)
  329. # When there is no dst transition, nothing special happens
  330. dr = date_range(datetime(2011, 6, 1, 0), periods=10,
  331. freq=datetools.Hour())
  332. localized = dr.tz_localize(tz)
  333. localized_infer = dr.tz_localize(tz, infer_dst=True)
  334. self.assert_numpy_array_equal(localized, localized_infer)
  335. # test utility methods
  336. def test_infer_tz(self):
  337. eastern = self.tz('US/Eastern')
  338. utc = pytz.utc
  339. _start = datetime(2001, 1, 1)
  340. _end = datetime(2009, 1, 1)
  341. start = self.localize(eastern, _start)
  342. end = self.localize(eastern, _end)
  343. assert(tools._infer_tzinfo(start, end) is self.localize(eastern, _start).tzinfo)
  344. assert(tools._infer_tzinfo(start, None) is self.localize(eastern, _start).tzinfo)
  345. assert(tools._infer_tzinfo(None, end) is self.localize(eastern, _end).tzinfo)
  346. start = utc.localize(_start)
  347. end = utc.localize(_end)
  348. assert(tools._infer_tzinfo(start, end) is utc)
  349. end = self.localize(eastern, _end)
  350. self.assertRaises(Exception, tools._infer_tzinfo, start, end)
  351. self.assertRaises(Exception, tools._infer_tzinfo, end, start)
  352. def test_tz_string(self):
  353. result = date_range('1/1/2000', periods=10, tz=self.tzstr('US/Eastern'))
  354. expected = date_range('1/1/2000', periods=10,
  355. tz=self.tz('US/Eastern'))
  356. self.assertTrue(result.equals(expected))
  357. def test_take_dont_lose_meta(self):
  358. tm._skip_if_no_pytz()
  359. rng = date_range('1/1/2000', periods=20, tz=self.tzstr('US/Eastern'))
  360. result = rng.take(lrange(5))
  361. self.assertEqual(result.tz, rng.tz)
  362. self.assertEqual(result.freq, rng.freq)
  363. def test_index_with_timezone_repr(self):
  364. rng = date_range('4/13/2010', '5/6/2010')
  365. rng_eastern = rng.tz_localize(self.tzstr('US/Eastern'))
  366. rng_repr = repr(rng_eastern)
  367. self.assertIn('2010-04-13 00:00:00', rng_repr)
  368. def test_index_astype_asobject_tzinfos(self):
  369. # #1345
  370. # dates around a dst transition
  371. rng = date_range('2/13/2010', '5/6/2010', tz=self.tzstr('US/Eastern'))
  372. objs = rng.asobject
  373. for i, x in enumerate(objs):
  374. exval = rng[i]
  375. self.assertEqual(x, exval)
  376. self.assertEqual(x.tzinfo, exval.tzinfo)
  377. objs = rng.astype(object)
  378. for i, x in enumerate(objs):
  379. exval = rng[i]
  380. self.assertEqual(x, exval)
  381. self.assertEqual(x.tzinfo, exval.tzinfo)
  382. def test_localized_at_time_between_time(self):
  383. from datetime import time
  384. rng = date_range('4/16/2012', '5/1/2012', freq='H')
  385. ts = Series(np.random.randn(len(rng)), index=rng)
  386. ts_local = ts.tz_localize(self.tzstr('US/Eastern'))
  387. result = ts_local.at_time(time(10, 0))
  388. expected = ts.at_time(time(10, 0)).tz_localize(self.tzstr('US/Eastern'))
  389. tm.assert_series_equal(result, expected)
  390. self.assertTrue(self.cmptz(result.index.tz, self.tz('US/Eastern')))
  391. t1, t2 = time(10, 0), time(11, 0)
  392. result = ts_local.between_time(t1, t2)
  393. expected = ts.between_time(t1, t2).tz_localize(self.tzstr('US/Eastern'))
  394. tm.assert_series_equal(result, expected)
  395. self.assertTrue(self.cmptz(result.index.tz, self.tz('US/Eastern')))
  396. def test_string_index_alias_tz_aware(self):
  397. rng = date_range('1/1/2000', periods=10, tz=self.tzstr('US/Eastern'))
  398. ts = Series(np.random.randn(len(rng)), index=rng)
  399. result = ts['1/3/2000']
  400. self.assertAlmostEqual(result, ts[2])
  401. def test_fixed_offset(self):
  402. dates = [datetime(2000, 1, 1, tzinfo=fixed_off),
  403. datetime(2000, 1, 2, tzinfo=fixed_off),
  404. datetime(2000, 1, 3, tzinfo=fixed_off)]
  405. result = to_datetime(dates)
  406. self.assertEqual(result.tz, fixed_off)
  407. def test_fixedtz_topydatetime(self):
  408. dates = np.array([datetime(2000, 1, 1, tzinfo=fixed_off),
  409. datetime(2000, 1, 2, tzinfo=fixed_off),
  410. datetime(2000, 1, 3, tzinfo=fixed_off)])
  411. result = to_datetime(dates).to_pydatetime()
  412. self.assert_numpy_array_equal(dates, result)
  413. result = to_datetime(dates)._mpl_repr()
  414. self.assert_numpy_array_equal(dates, result)
  415. def test_convert_tz_aware_datetime_datetime(self):
  416. # #1581
  417. tz = self.tz('US/Eastern')
  418. dates = [datetime(2000, 1, 1), datetime(2000, 1, 2),
  419. datetime(2000, 1, 3)]
  420. dates_aware = [self.localize(tz, x) for x in dates]
  421. result = to_datetime(dates_aware)
  422. self.assertTrue(self.cmptz(result.tz, self.tz('US/Eastern')))
  423. converted = to_datetime(dates_aware, utc=True)
  424. ex_vals = [Timestamp(x).value for x in dates_aware]
  425. self.assert_numpy_array_equal(converted.asi8, ex_vals)
  426. self.assertIs(converted.tz, pytz.utc)
  427. def test_to_datetime_utc(self):
  428. from dateutil.parser import parse
  429. arr = np.array([parse('2012-06-13T01:39:00Z')], dtype=object)
  430. result = to_datetime(arr, utc=True)
  431. self.assertIs(result.tz, pytz.utc)
  432. def test_to_datetime_tzlocal(self):
  433. from dateutil.parser import parse
  434. from dateutil.tz import tzlocal
  435. dt = parse('2012-06-13T01:39:00Z')
  436. dt = dt.replace(tzinfo=tzlocal())
  437. arr = np.array([dt], dtype=object)
  438. result = to_datetime(arr, utc=True)
  439. self.assertIs(result.tz, pytz.utc)
  440. rng = date_range('2012-11-03 03:00', '2012-11-05 03:00', tz=tzlocal())
  441. arr = rng.to_pydatetime()
  442. result = to_datetime(arr, utc=True)
  443. self.assertIs(result.tz, pytz.utc)
  444. def test_frame_no_datetime64_dtype(self):
  445. dr = date_range('2011/1/1', '2012/1/1', freq='W-FRI')
  446. dr_tz = dr.tz_localize(self.tzstr('US/Eastern'))
  447. e = DataFrame({'A': 'foo', 'B': dr_tz}, index=dr)
  448. self.assertEqual(e['B'].dtype, 'M8[ns]')
  449. # GH 2810 (with timezones)
  450. datetimes_naive = [ ts.to_pydatetime() for ts in dr ]
  451. datetimes_with_tz = [ ts.to_pydatetime() for ts in dr_tz ]
  452. df = DataFrame({'dr' : dr, 'dr_tz' : dr_tz,
  453. 'datetimes_naive': datetimes_naive,
  454. 'datetimes_with_tz' : datetimes_with_tz })
  455. result = df.get_dtype_counts()
  456. expected = Series({ 'datetime64[ns]' : 3, 'object' : 1 })
  457. tm.assert_series_equal(result, expected)
  458. def test_hongkong_tz_convert(self):
  459. # #1673
  460. dr = date_range(
  461. '2012-01-01', '2012-01-10', freq='D', tz='Hongkong')
  462. # it works!
  463. dr.hour
  464. def test_tz_convert_unsorted(self):
  465. dr = date_range('2012-03-09', freq='H', periods=100, tz='utc')
  466. dr = dr.tz_convert(self.tzstr('US/Eastern'))
  467. result = dr[::-1].hour
  468. exp = dr.hour[::-1]
  469. tm.assert_almost_equal(result, exp)
  470. def test_shift_localized(self):
  471. dr = date_range('2011/1/1', '2012/1/1', freq='W-FRI')
  472. dr_tz = dr.tz_localize(self.tzstr('US/Eastern'))
  473. result = dr_tz.shift(1, '10T')
  474. self.assertEqual(result.tz, dr_tz.tz)
  475. def test_tz_aware_asfreq(self):
  476. dr = date_range(
  477. '2011-12-01', '2012-07-20', freq='D', tz=self.tzstr('US/Eastern'))
  478. s = Series(np.random.randn(len(dr)), index=dr)
  479. # it works!
  480. s.asfreq('T')
  481. def test_static_tzinfo(self):
  482. # it works!
  483. index = DatetimeIndex([datetime(2012, 1, 1)], tz=self.tzstr('EST'))
  484. index.hour
  485. index[0]
  486. def test_tzaware_datetime_to_index(self):
  487. d = [datetime(2012, 8, 19, tzinfo=self.tz('US/Eastern'))]
  488. index = DatetimeIndex(d)
  489. self.assertTrue(self.cmptz(index.tz, self.tz('US/Eastern')))
  490. def test_date_range_span_dst_transition(self):
  491. # #1778
  492. # Standard -> Daylight Savings Time
  493. dr = date_range('03/06/2012 00:00', periods=200, freq='W-FRI',
  494. tz='US/Eastern')
  495. self.assertTrue((dr.hour == 0).all())
  496. dr = date_range('2012-11-02', periods=10, tz=self.tzstr('US/Eastern'))
  497. self.assertTrue((dr.hour == 0).all())
  498. def test_convert_datetime_list(self):
  499. dr = date_range('2012-06-02', periods=10, tz=self.tzstr('US/Eastern'))
  500. dr2 = DatetimeIndex(list(dr), name='foo')
  501. self.assertTrue(dr.equals(dr2))
  502. self.assertEqual(dr.tz, dr2.tz)
  503. self.assertEqual(dr2.name, 'foo')
  504. def test_frame_from_records_utc(self):
  505. rec = {'datum': 1.5,
  506. 'begin_time': datetime(2006, 4, 27, tzinfo=pytz.utc)}
  507. # it works
  508. DataFrame.from_records([rec], index='begin_time')
  509. def test_frame_reset_index(self):
  510. dr = date_range('2012-06-02', periods=10, tz=self.tzstr('US/Eastern'))
  511. df = DataFrame(np.random.randn(len(dr)), dr)
  512. roundtripped = df.reset_index().set_index('index')
  513. xp = df.index.tz
  514. rs = roundtripped.index.tz
  515. self.assertEqual(xp, rs)
  516. def test_dateutil_tzoffset_support(self):
  517. from dateutil.tz import tzoffset
  518. values = [188.5, 328.25]
  519. tzinfo = tzoffset(None, 7200)
  520. index = [datetime(2012, 5, 11, 11, tzinfo=tzinfo),
  521. datetime(2012, 5, 11, 12, tzinfo=tzinfo)]
  522. series = Series(data=values, index=index)
  523. self.assertEqual(series.index.tz, tzinfo)
  524. # it works! #2443
  525. repr(series.index[0])
  526. def test_getitem_pydatetime_tz(self):
  527. index = date_range(start='2012-12-24 16:00',
  528. end='2012-12-24 18:00', freq='H',
  529. tz=self.tzstr('Europe/Berlin'))
  530. ts = Series(index=index, data=index.hour)
  531. time_pandas = Timestamp('2012-12-24 17:00', tz=self.tzstr('Europe/Berlin'))
  532. time_datetime = self.localize(self.tz('Europe/Berlin'), datetime(2012, 12, 24, 17, 0))
  533. self.assertEqual(ts[time_pandas], ts[time_datetime])
  534. def test_index_drop_dont_lose_tz(self):
  535. # #2621
  536. ind = date_range("2012-12-01", periods=10, tz="utc")
  537. ind = ind.drop(ind[-1])
  538. self.assertTrue(ind.tz is not None)
  539. def test_datetimeindex_tz(self):
  540. """ Test different DatetimeIndex constructions with timezone
  541. Follow-up of #4229
  542. """
  543. arr = ['11/10/2005 08:00:00', '11/10/2005 09:00:00']
  544. idx1 = to_datetime(arr).tz_localize(self.tzstr('US/Eastern'))
  545. idx2 = DatetimeIndex(start="2005-11-10 08:00:00", freq='H', periods=2, tz=self.tzstr('US/Eastern'))
  546. idx3 = DatetimeIndex(arr, tz=self.tzstr('US/Eastern'))
  547. idx4 = DatetimeIndex(np.array(arr), tz=self.tzstr('US/Eastern'))
  548. for other in [idx2, idx3, idx4]:
  549. self.assertTrue(idx1.equals(other))
  550. def test_datetimeindex_tz_nat(self):
  551. idx = to_datetime([Timestamp("2013-1-1", tz=self.tzstr('US/Eastern')), NaT])
  552. self.assertTrue(isnull(idx[1]))
  553. self.assertTrue(idx[0].tzinfo is not None)
  554. class TestTimeZoneSupportDateutil(TestTimeZoneSupportPytz):
  555. _multiprocess_can_split_ = True
  556. def setUp(self):
  557. tm._skip_if_no_dateutil()
  558. def tz(self, tz):
  559. '''
  560. Construct a dateutil timezone.
  561. Use tslib.maybe_get_tz so that we get the filename on the tz right
  562. on windows. See #7337.
  563. '''
  564. return tslib.maybe_get_tz('dateutil/' + tz)
  565. def tzstr(self, tz):
  566. ''' Construct a timezone string from a string. Overridden in subclass to parameterize tests. '''
  567. return 'dateutil/' + tz
  568. def cmptz(self, tz1, tz2):
  569. ''' Compare two timezones. Overridden in subclass to parameterize tests. '''
  570. return tz1 == tz2
  571. def localize(self, tz, x):
  572. return x.replace(tzinfo=tz)
  573. def test_utc_with_system_utc(self):
  574. if sys.platform == 'win32':
  575. raise nose.SkipTest('Skipped on win32 due to dateutil bug.')
  576. from pandas.tslib import maybe_get_tz
  577. # from system utc to real utc
  578. ts = Timestamp('2001-01-05 11:56', tz=maybe_get_tz('dateutil/UTC'))
  579. # check that the time hasn't changed.
  580. self.assertEqual(ts, ts.tz_convert(dateutil.tz.tzutc()))
  581. # from system utc to real utc
  582. ts = Timestamp('2001-01-05 11:56', tz=maybe_get_tz('dateutil/UTC'))
  583. # check that the time hasn't changed.
  584. self.assertEqual(ts, ts.tz_convert(dateutil.tz.tzutc()))
  585. class TestTimeZoneCacheKey(tm.TestCase):
  586. def test_cache_keys_are_distinct_for_pytz_vs_dateutil(self):
  587. tzs = pytz.common_timezones
  588. for tz_name in tzs:
  589. if tz_name == 'UTC':
  590. # skip utc as it's a special case in dateutil
  591. continue
  592. tz_p = tslib.maybe_get_tz(tz_name)
  593. tz_d = tslib.maybe_get_tz('dateutil/' + tz_name)
  594. if tz_d is None:
  595. # skip timezones that dateutil doesn't know about.
  596. continue
  597. self.assertNotEqual(tslib._p_tz_cache_key(tz_p), tslib._p_tz_cache_key(tz_d))
  598. class TestTimeZones(tm.TestCase):
  599. _multiprocess_can_split_ = True
  600. def setUp(self):
  601. tm._skip_if_no_pytz()
  602. def test_index_equals_with_tz(self):
  603. left = date_range('1/1/2011', periods=100, freq='H', tz='utc')
  604. right = date_range('1/1/2011', periods=100, freq='H',
  605. tz='US/Eastern')
  606. self.assertFalse(left.equals(right))
  607. def test_tz_localize_naive(self):
  608. rng = date_range('1/1/2011', periods=100, freq='H')
  609. conv = rng.tz_localize('US/Pacific')
  610. exp = date_range('1/1/2011', periods=100, freq='H', tz='US/Pacific')
  611. self.assertTrue(conv.equals(exp))
  612. def test_series_frame_tz_localize(self):
  613. rng = date_range('1/1/2011', periods=100, freq='H')
  614. ts = Series(1, index=rng)
  615. result = ts.tz_localize('utc')
  616. self.assertEqual(result.index.tz.zone, 'UTC')
  617. df = DataFrame({'a': 1}, index=rng)
  618. result = df.tz_localize('utc')
  619. expected = DataFrame({'a': 1}, rng.tz_localize('UTC'))
  620. self.assertEqual(result.index.tz.zone, 'UTC')
  621. assert_frame_equal(result, expected)
  622. df = df.T
  623. result = df.tz_localize('utc', axis=1)
  624. self.assertEqual(result.columns.tz.zone, 'UTC')
  625. assert_frame_equal(result, expected.T)
  626. # Can't localize if already tz-aware
  627. rng = date_range('1/1/2011', periods=100, freq='H', tz='utc')
  628. ts = Series(1, index=rng)
  629. tm.assertRaisesRegexp(TypeError, 'Already tz-aware', ts.tz_localize, 'US/Eastern')
  630. def test_series_frame_tz_convert(self):
  631. rng = date_range('1/1/2011', periods=200, freq='D',
  632. tz='US/Eastern')
  633. ts = Series(1, index=rng)
  634. result = ts.tz_convert('Europe/Berlin')
  635. self.assertEqual(result.index.tz.zone, 'Europe/Berlin')
  636. df = DataFrame({'a': 1}, index=rng)
  637. result = df.tz_convert('Europe/Berlin')
  638. expected = DataFrame({'a': 1}, rng.tz_convert('Europe/Berlin'))
  639. self.assertEqual(result.index.tz.zone, 'Europe/Berlin')
  640. assert_frame_equal(result, expected)
  641. df = df.T
  642. result = df.tz_convert('Europe/Berlin', axis=1)
  643. self.assertEqual(result.columns.tz.zone, 'Europe/Berlin')
  644. assert_frame_equal(result, expected.T)
  645. # can't convert tz-naive
  646. rng = date_range('1/1/2011', periods=200, freq='D')
  647. ts = Series(1, index=rng)
  648. tm.assertRaisesRegexp(TypeError, "Cannot convert tz-naive", ts.tz_convert, 'US/Eastern')
  649. def test_join_utc_convert(self):
  650. rng = date_range('1/1/2011', periods=100, freq='H', tz='utc')
  651. left = rng.tz_convert('US/Eastern')
  652. right = rng.tz_convert('Europe/Berlin')
  653. for how in ['inner', 'outer', 'left', 'right']:
  654. result = left.join(left[:-5], how=how)
  655. tm.assert_isinstance(result, DatetimeIndex)
  656. self.assertEqual(result.tz, left.tz)
  657. result = left.join(right[:-5], how=how)
  658. tm.assert_isinstance(result, DatetimeIndex)
  659. self.assertEqual(result.tz.zone, 'UTC')
  660. def test_join_aware(self):
  661. rng = date_range('1/1/2011', periods=10, freq='H')
  662. ts = Series(np.random.randn(len(rng)), index=rng)
  663. ts_utc = ts.tz_localize('utc')
  664. self.assertRaises(Exception, ts.__add__, ts_utc)
  665. self.assertRaises(Exception, ts_utc.__add__, ts)
  666. test1 = DataFrame(np.zeros((6, 3)),
  667. index=date_range("2012-11-15 00:00:00", periods=6,
  668. freq="100L", tz="US/Central"))
  669. test2 = DataFrame(np.zeros((3, 3)),
  670. index=date_range("2012-11-15 00:00:00", periods=3,
  671. freq="250L", tz="US/Central"),
  672. columns=lrange(3, 6))
  673. result = test1.join(test2, how='outer')
  674. ex_index = test1.index.union(test2.index)
  675. self.assertTrue(result.index.equals(ex_index))
  676. self.assertTrue(result.index.tz.zone == 'US/Central')
  677. # non-overlapping
  678. rng = date_range("2012-11-15 00:00:00", periods=6,
  679. freq="H", tz="US/Central")
  680. rng2 = date_range("2012-11-15 12:00:00", periods=6,
  681. freq="H", tz="US/Eastern")
  682. result = rng.union(rng2)
  683. self.assertTrue(result.tz.zone == 'UTC')
  684. def test_align_aware(self):
  685. idx1 = date_range('2001', periods=5, freq='H', tz='US/Eastern')
  686. idx2 = date_range('2001', periods=5, freq='2H', tz='US/Eastern')
  687. df1 = DataFrame(np.random.randn(len(idx1), 3), idx1)
  688. df2 = DataFrame(np.random.randn(len(idx2), 3), idx2)
  689. new1, new2 = df1.align(df2)
  690. self.assertEqual(df1.index.tz, new1.index.tz)
  691. self.assertEqual(df2.index.tz, new2.index.tz)
  692. def test_append_aware(self):
  693. rng1 = date_range('1/1/2011 01:00', periods=1, freq='H',
  694. tz='US/Eastern')
  695. rng2 = date_range('1/1/2011 02:00', periods=1, freq='H',
  696. tz='US/Eastern')
  697. ts1 = Series(np.random.randn(len(rng1)), index=rng1)
  698. ts2 = Series(np.random.randn(len(rng2)), index=rng2)
  699. ts_result = ts1.append(ts2)
  700. self.assertEqual(ts_result.index.tz, rng1.tz)
  701. rng1 = date_range('1/1/2011 01:00', periods=1, freq='H',
  702. tz='UTC')
  703. rng2 = date_range('1/1/2011 02:00', periods=1, freq='H',
  704. tz='UTC')
  705. ts1 = Series(np.random.randn(len(rng1)), index=rng1)
  706. ts2 = Series(np.random.randn(len(rng2)), index=rng2)
  707. ts_result = ts1.append(ts2)
  708. utc = rng1.tz
  709. self.assertEqual(utc, ts_result.index.tz)
  710. rng1 = date_range('1/1/2011 01:00', periods=1, freq='H',
  711. tz='US/Eastern')
  712. rng2 = date_range('1/1/2011 02:00', periods=1, freq='H',
  713. tz='US/Central')
  714. ts1 = Series(np.random.randn(len(rng1)), index=rng1)
  715. ts2 = Series(np.random.randn(len(rng2)), index=rng2)
  716. ts_result = ts1.append(ts2)
  717. self.assertEqual(utc, ts_result.index.tz)
  718. def test_append_aware_naive(self):
  719. rng1 = date_range('1/1/2011 01:00', periods=1, freq='H')
  720. rng2 = date_range('1/1/2011 02:00', periods=1, freq='H',
  721. tz='US/Eastern')
  722. ts1 = Series(np.random.randn(len(rng1)), index=rng1)
  723. ts2 = Series(np.random.randn(len(rng2)), index=rng2)
  724. ts_result = ts1.append(ts2)
  725. self.assertTrue(ts_result.index.equals(
  726. ts1.index.asobject.append(ts2.index.asobject)))
  727. # mixed
  728. rng1 = date_range('1/1/2011 01:00', periods=1, freq='H')
  729. rng2 = lrange(100)
  730. ts1 = Series(np.random.randn(len(rng1)), index=rng1)
  731. ts2 = Series(np.random.randn(len(rng2)), index=rng2)
  732. ts_result = ts1.append(ts2)
  733. self.assertTrue(ts_result.index.equals(
  734. ts1.index.asobject.append(ts2.index)))
  735. def test_equal_join_ensure_utc(self):
  736. rng = date_range('1/1/2011', periods=10, freq='H', tz='US/Eastern')
  737. ts = Series(np.random.randn(len(rng)), index=rng)
  738. ts_moscow = ts.tz_convert('Europe/Moscow')
  739. result = ts + ts_moscow
  740. self.assertIs(result.index.tz, pytz.utc)
  741. result = ts_moscow + ts
  742. self.assertIs(result.index.tz, pytz.utc)
  743. df = DataFrame({'a': ts})
  744. df_moscow = df.tz_convert('Europe/Moscow')
  745. result = df + df_moscow
  746. self.assertIs(result.index.tz, pytz.utc)
  747. result = df_moscow + df
  748. self.assertIs(result.index.tz, pytz.utc)
  749. def test_arith_utc_convert(self):
  750. rng = date_range('1/1/2011', periods=100, freq='H', tz='utc')
  751. perm = np.random.permutation(100)[:90]
  752. ts1 = Series(np.random.randn(90),
  753. index=rng.take(perm).tz_convert('US/Eastern'))
  754. perm = np.random.permutation(100)[:90]
  755. ts2 = Series(np.random.randn(90),
  756. index=rng.take(perm).tz_convert('Europe/Berlin'))
  757. result = ts1 + ts2
  758. uts1 = ts1.tz_convert('utc')
  759. uts2 = ts2.tz_convert('utc')
  760. expected = uts1 + uts2
  761. self.assertEqual(result.index.tz, pytz.UTC)
  762. tm.assert_series_equal(result, expected)
  763. def test_intersection(self):
  764. rng = date_range('1/1/2011', periods=100, freq='H', tz='utc')
  765. left = rng[10:90][::-1]
  766. right = rng[20:80][::-1]
  767. self.assertEqual(left.tz, rng.tz)
  768. result = left.intersection(right)
  769. self.assertEqual(result.tz, left.tz)
  770. def test_timestamp_equality_different_timezones(self):
  771. utc_range = date_range('1/1/2000', periods=20, tz='UTC')
  772. eastern_range = utc_range.tz_convert('US/Eastern')
  773. berlin_range = utc_range.tz_convert('Europe/Berlin')
  774. for a, b, c in zip(utc_range, eastern_range, berlin_range):
  775. self.assertEqual(a, b)
  776. self.assertEqual(b, c)
  777. self.assertEqual(a, c)
  778. self.assertTrue((utc_range == eastern_range).all())
  779. self.assertTrue((utc_range == berlin_range).all())
  780. self.assertTrue((berlin_range == eastern_range).all())
  781. def test_datetimeindex_tz(self):
  782. rng = date_range('03/12/2012 00:00', periods=10, freq='W-FRI',
  783. tz='US/Eastern')
  784. rng2 = DatetimeIndex(data=rng, tz='US/Eastern')
  785. self.assertTrue(rng.equals(rng2))
  786. def test_normalize_tz(self):
  787. rng = date_range('1/1/2000 9:30', periods=10, freq='D',
  788. tz='US/Eastern')
  789. result = rng.normalize()
  790. expected = date_range('1/1/2000', periods=10, freq='D',
  791. tz='US/Eastern')
  792. self.assertTrue(result.equals(expected))
  793. self.assertTrue(result.is_normalized)
  794. self.assertFalse(rng.is_normalized)
  795. rng = date_range('1/1/2000 9:30', periods=10, freq='D',
  796. tz='UTC')
  797. result = rng.normalize()
  798. expected = date_range('1/1/2000', periods=10, freq='D',
  799. tz='UTC')
  800. self.assertTrue(result.equals(expected))
  801. self.assertTrue(result.is_normalized)
  802. self.assertFalse(rng.is_normalized)
  803. from dateutil.tz import tzlocal
  804. rng = date_range('1/1/2000 9:30', periods=10, freq='D',
  805. tz=tzlocal())
  806. result = rng.normalize()
  807. expected = date_range('1/1/2000', periods=10, freq='D',
  808. tz=tzlocal())
  809. self.assertTrue(result.equals(expected))
  810. self.assertTrue(result.is_normalized)
  811. self.assertFalse(rng.is_normalized)
  812. def test_tzaware_offset(self):
  813. dates = date_range('2012-11-01', periods=3, tz='US/Pacific')
  814. offset = dates + offsets.Hour(5)
  815. self.assertEqual(dates[0] + offsets.Hour(5), offset[0])
  816. # GH 6818
  817. for tz in ['UTC', 'US/Pacific', 'Asia/Tokyo']:
  818. dates = date_range('2010-11-01 00:00', periods=3, tz=tz, freq='H')
  819. expected = DatetimeIndex(['2010-11-01 05:00', '2010-11-01 06:00',
  820. '2010-11-01 07:00'], freq='H', tz=tz)
  821. offset = dates + offsets.Hour(5)
  822. self.assertTrue(offset.equals(expected))
  823. if not _np_version_under1p7:
  824. offset = dates + np.timedelta64(5, 'h')
  825. self.assertTrue(offset.equals(expected))
  826. offset = dates + timedelta(hours=5)
  827. self.assertTrue(offset.equals(expected))
  828. def test_nat(self):
  829. # GH 5546
  830. dates = [NaT]
  831. idx = DatetimeIndex(dates)
  832. idx = idx.tz_localize('US/Pacific')
  833. self.assertTrue(idx.equals(DatetimeIndex(dates, tz='US/Pacific')))
  834. idx = idx.tz_convert('US/Eastern')
  835. self.assertTrue(idx.equals(DatetimeIndex(dates, tz='US/Eastern')))
  836. idx = idx.tz_convert('UTC')
  837. self.assertTrue(idx.equals(DatetimeIndex(dates, tz='UTC')))
  838. dates = ['2010-12-01 00:00', '2010-12-02 00:00', NaT]
  839. idx = DatetimeIndex(dates)
  840. idx = idx.tz_localize('US/Pacific')
  841. self.assertTrue(idx.equals(DatetimeIndex(dates, tz='US/Pacific')))
  842. idx = idx.tz_convert('US/Eastern')
  843. expected = ['2010-12-01 03:00', '2010-12-02 03:00', NaT]
  844. self.assertTrue(idx.equals(DatetimeIndex(expected, tz='US/Eastern')))
  845. idx = idx + offsets.Hour(5)
  846. expected = ['2010-12-01 08:00', '2010-12-02 08:00', NaT]
  847. self.assertTrue(idx.equals(DatetimeIndex(expected, tz='US/Eastern')))
  848. idx = idx.tz_convert('US/Pacific')
  849. expected = ['2010-12-01 05:00', '2010-12-02 05:00', NaT]
  850. self.assertTrue(idx.equals(DatetimeIndex(expected, tz='US/Pacific')))
  851. if not _np_version_under1p7:
  852. idx = idx + np.timedelta64(3, 'h')
  853. expected = ['2010-12-01 08:00', '2010-12-02 08:00', NaT]
  854. self.assertTrue(idx.equals(DatetimeIndex(expected, tz='US/Pacific')))
  855. idx = idx.tz_convert('US/Eastern')
  856. expected = ['2010-12-01 11:00', '2010-12-02 11:00', NaT]
  857. self.assertTrue(idx.equals(DatetimeIndex(expected, tz='US/Eastern')))
  858. if __name__ == '__main__':
  859. nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'],
  860. exit=False)