Skip to content

Commit 2393ba9

Browse files
committed
ENH: store pytz time zones as zone strings in HDFStore, close #1232
1 parent 7ac1b51 commit 2393ba9

File tree

3 files changed

+38
-7
lines changed

3 files changed

+38
-7
lines changed

pandas/io/pytables.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,9 @@ def _write_index(self, group, key, index):
585585
if hasattr(index, 'freq'):
586586
node._v_attrs.freq = index.freq
587587

588+
if hasattr(index, 'tz') and index.tz is not None:
589+
node._v_attrs.tz = index.tz.zone
590+
588591
def _read_index(self, group, key):
589592
variety = getattr(group._v_attrs, '%s_variety' % key)
590593

@@ -668,15 +671,21 @@ def _read_index_node(self, node):
668671
name = node._v_attrs.name
669672

670673
index_class = getattr(node._v_attrs, 'index_class', Index)
674+
675+
factory = _get_index_factory(index_class)
676+
671677
kwargs = {}
672678
if 'freq' in node._v_attrs:
673679
kwargs['freq'] = node._v_attrs['freq']
674680

681+
if 'tz' in node._v_attrs:
682+
kwargs['tz'] = node._v_attrs['tz']
683+
675684
if kind in ('date', 'datetime'):
676-
index = index_class(_unconvert_index(data, kind), dtype=object,
677-
**kwargs)
685+
index = factory(_unconvert_index(data, kind), dtype=object,
686+
**kwargs)
678687
else:
679-
index = index_class(_unconvert_index(data, kind), **kwargs)
688+
index = factory(_unconvert_index(data, kind), **kwargs)
680689

681690
index.name = name
682691

@@ -1085,3 +1094,11 @@ def select_coords(self):
10851094
"""
10861095
self.values = self.table.getWhereList(self.the_condition)
10871096

1097+
def _get_index_factory(klass):
1098+
if klass == DatetimeIndex:
1099+
def f(values, freq=None, tz=None):
1100+
return DatetimeIndex._simple_new(values, None, freq=freq,
1101+
tz=tz)
1102+
return f
1103+
return klass
1104+

pandas/io/tests/test_pytables.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
from datetime import datetime
99
import numpy as np
1010

11-
from pandas import Series, DataFrame, Panel, MultiIndex, bdate_range
11+
from pandas import (Series, DataFrame, Panel, MultiIndex, bdate_range,
12+
date_range)
1213
from pandas.io.pytables import HDFStore, get_store
1314
import pandas.util.testing as tm
1415
from pandas.tests.test_series import assert_series_equal
@@ -338,6 +339,19 @@ def test_can_serialize_dates(self):
338339
frame = DataFrame(np.random.randn(len(rng), 4), index=rng)
339340
self._check_roundtrip(frame, tm.assert_frame_equal)
340341

342+
def test_timezones(self):
343+
rng = date_range('1/1/2000', '1/30/2000', tz='US/Eastern')
344+
frame = DataFrame(np.random.randn(len(rng), 4), index=rng)
345+
try:
346+
store = HDFStore(self.scratchpath)
347+
store['frame'] = frame
348+
recons = store['frame']
349+
self.assert_(recons.index.equals(rng))
350+
self.assertEquals(rng.tz, recons.index.tz)
351+
finally:
352+
store.close()
353+
os.remove(self.scratchpath)
354+
341355
def test_store_hierarchical(self):
342356
index = MultiIndex(levels=[['foo', 'bar', 'baz', 'qux'],
343357
['one', 'two', 'three']],

pandas/tseries/index.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -322,11 +322,11 @@ def _generate(cls, start, end, periods, name, offset,
322322
return index
323323

324324
@classmethod
325-
def _simple_new(cls, values, name, offset, tz):
325+
def _simple_new(cls, values, name, freq=None, tz=None):
326326
result = values.view(cls)
327327
result.name = name
328-
result.offset = offset
329-
result.tz = tz
328+
result.offset = freq
329+
result.tz = tools._maybe_get_tz(tz)
330330

331331
return result
332332

0 commit comments

Comments
 (0)