From f08e25026921b208ed3d0d74a99fd58a3aef77bb Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Sun, 8 Dec 2019 09:52:31 -0800 Subject: [PATCH 1/2] REF: move tz setting to the constructor --- pandas/io/pytables.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index f08fe96704b2a..2a33e276f4d9f 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -2222,10 +2222,17 @@ class DataCol(IndexCol): _info_fields = ["tz", "ordered"] def __init__( - self, name: str, values=None, kind=None, typ=None, cname=None, pos=None, + self, + name: str, + values=None, + kind=None, + typ=None, + cname=None, + pos=None, + tz=None, ): super().__init__( - name=name, values=values, kind=kind, typ=typ, pos=pos, cname=cname + name=name, values=values, kind=kind, typ=typ, pos=pos, cname=cname, tz=tz ) self.dtype = None self.data = None @@ -2288,8 +2295,6 @@ def set_atom(self, block): # short-cut certain block types if block.is_categorical: self.set_atom_categorical(block) - elif block.is_datetimetz: - self.set_atom_datetime64tz(block) @classmethod def _get_atom(cls, values: Union[np.ndarray, ABCExtensionArray]) -> "Col": @@ -2363,11 +2368,6 @@ def set_atom_categorical(self, block): def get_atom_datetime64(cls, shape): return _tables().Int64Col(shape=shape[0]) - def set_atom_datetime64tz(self, block): - - # store a converted timezone - self.tz = _get_tz(block.values.tz) - @classmethod def get_atom_timedelta64(cls, shape): return _tables().Int64Col(shape=shape[0]) @@ -3872,6 +3872,7 @@ def get_blk_items(mgr, blocks): typ = klass._get_atom(data_converted) kind = _dtype_to_kind(data_converted.dtype.name) + tz = _get_tz(data_converted.tz) if hasattr(data_converted, "tz") else None col = klass( name=adj_name, @@ -3880,6 +3881,7 @@ def get_blk_items(mgr, blocks): typ=typ, pos=j, kind=kind, + tz=tz, ) col.set_atom(block=b) col.set_data(data_converted) From 55bb70af55e6be849b9073e8befa5726e0a113dc Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Sun, 8 Dec 2019 10:12:19 -0800 Subject: [PATCH 2/2] REF: pytables set attrs in constructor, avoid need for set_atom --- pandas/io/pytables.py | 55 ++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 2a33e276f4d9f..30141d3bf9467 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -1895,6 +1895,9 @@ def __init__( freq=None, tz=None, index_name=None, + ordered=None, + meta=None, + metadata=None, ): if not isinstance(name, str): @@ -1910,9 +1913,10 @@ def __init__( self.freq = freq self.tz = tz self.index_name = index_name + self.ordered = ordered self.table = None - self.meta = None - self.metadata = None + self.meta = meta + self.metadata = metadata if pos is not None: self.set_pos(pos) @@ -2230,9 +2234,21 @@ def __init__( cname=None, pos=None, tz=None, + ordered=None, + meta=None, + metadata=None, ): super().__init__( - name=name, values=values, kind=kind, typ=typ, pos=pos, cname=cname, tz=tz + name=name, + values=values, + kind=kind, + typ=typ, + pos=pos, + cname=cname, + tz=tz, + ordered=ordered, + meta=meta, + metadata=metadata, ) self.dtype = None self.data = None @@ -2289,13 +2305,6 @@ def take_data(self): self.data, data = None, self.data return data - def set_atom(self, block): - """ create and setup my atom from the block b """ - - # short-cut certain block types - if block.is_categorical: - self.set_atom_categorical(block) - @classmethod def _get_atom(cls, values: Union[np.ndarray, ABCExtensionArray]) -> "Col": """ @@ -2348,22 +2357,6 @@ def get_atom_coltype(cls, kind: str) -> Type["Col"]: def get_atom_data(cls, shape, kind: str) -> "Col": return cls.get_atom_coltype(kind=kind)(shape=shape[0]) - def set_atom_categorical(self, block): - # currently only supports a 1-D categorical - # in a 1-D block - - values = block.values - - if values.ndim > 1: - raise NotImplementedError("only support 1-d categoricals") - - # write the codes; must be in a block shape - self.ordered = values.ordered - - # write the categories - self.meta = "category" - self.metadata = np.array(values.categories, copy=False).ravel() - @classmethod def get_atom_datetime64(cls, shape): return _tables().Int64Col(shape=shape[0]) @@ -3874,6 +3867,12 @@ def get_blk_items(mgr, blocks): kind = _dtype_to_kind(data_converted.dtype.name) tz = _get_tz(data_converted.tz) if hasattr(data_converted, "tz") else None + meta = metadata = ordered = None + if is_categorical_dtype(data_converted): + ordered = data_converted.ordered + meta = "category" + metadata = np.array(data_converted.categories, copy=False).ravel() + col = klass( name=adj_name, cname=new_name, @@ -3882,8 +3881,10 @@ def get_blk_items(mgr, blocks): pos=j, kind=kind, tz=tz, + ordered=ordered, + meta=meta, + metadata=metadata, ) - col.set_atom(block=b) col.set_data(data_converted) col.update_info(self.info)