diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 458a245da6bdb..ca7b62296bc5c 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -1766,7 +1766,7 @@ def set_kind(self): # set my typ if we need if self.typ is None: - self.typ = getattr(self.description, self.cname, None) + self.typ = getattr(self.description, str(self.cname), None) def set_atom(self, block, block_items, existing_col, min_itemsize, nan_rep, info, encoding=None, **kwargs): @@ -3018,6 +3018,8 @@ def write_metadata(self, key, values): def read_metadata(self, key): """ return the meta data array for this key """ + if str(key) != key: + key = str(key) if getattr(getattr(self.group,'meta',None),key,None) is not None: return self.parent.select(self._get_metadata_path(key)) return None @@ -3157,6 +3159,8 @@ def create_index(self, columns=None, optlevel=None, kind=None): table = self.table for c in columns: + if str(c) != c: + c = str(c) v = getattr(table.cols, c, None) if v is not None: @@ -3519,6 +3523,11 @@ def create_description(self, complib=None, complevel=None, # description from the axes & values d['description'] = dict([(a.cname, a.typ) for a in self.axes]) + # keys to pytables columns must be strings + for a in self.axes: + if str(a.cname) != a.cname: + d['description'][str(a.cname)] = d['description'].pop(a.cname) + if complib: if complevel is None: complevel = self._complevel or 9 diff --git a/pandas/io/tests/test_pytables.py b/pandas/io/tests/test_pytables.py index 03e7a8eae549d..ef06f0a000ba5 100644 --- a/pandas/io/tests/test_pytables.py +++ b/pandas/io/tests/test_pytables.py @@ -4,6 +4,7 @@ import warnings import tempfile from contextlib import contextmanager +from tempfile import NamedTemporaryFile import datetime import numpy as np @@ -4623,6 +4624,27 @@ def _test_sort(obj): else: raise ValueError('type not supported here') +class TestToHdfWithIntegerColumnNames(tm.TestCase): + # GH9057 + def setUp(self): + N = 2 + array = np.random.randint(0,8, size=N*N).astype('uint8').reshape(N,-1) + df = DataFrame(array, index=pd.date_range('20130206', + periods=N,freq='ms')) + + self.filename = NamedTemporaryFile(suffix='.h5', delete=False).name + df.to_hdf(self.filename,'df', mode='w', format='table', + data_columns=True) + + def test_file_is_openable(self): + + with tables.open_file(self.filename, 'r') as myfile: + stuff = myfile.root.df + assert stuff + + def tearDown(self): + os.remove(self.filename) + if __name__ == '__main__': import nose diff --git a/pandas/tests/test_frame.py b/pandas/tests/test_frame.py index c7c35e63d3d91..1067711acdb52 100644 --- a/pandas/tests/test_frame.py +++ b/pandas/tests/test_frame.py @@ -5,6 +5,7 @@ from copy import deepcopy from datetime import datetime, timedelta, time import sys +import os import operator import re import csv @@ -14204,7 +14205,6 @@ def _constructor(self): # GH9776 self.assertEqual(df.iloc[0:1, :].testattr, 'XXX') - def skip_if_no_ne(engine='numexpr'): if engine == 'numexpr': try: