@@ -943,7 +943,8 @@ class IndexCol(object):
943
943
is_searchable = False
944
944
945
945
def __init__ (self , values = None , kind = None , typ = None , cname = None , itemsize = None ,
946
- name = None , axis = None , kind_attr = None , pos = None , ** kwargs ):
946
+ name = None , axis = None , kind_attr = None , pos = None , freq = None , tz = None ,
947
+ index_name = None , ** kwargs ):
947
948
self .values = values
948
949
self .kind = kind
949
950
self .typ = typ
@@ -953,6 +954,9 @@ def __init__(self, values=None, kind=None, typ=None, cname=None, itemsize=None,
953
954
self .kind_attr = kind_attr
954
955
self .axis = axis
955
956
self .pos = pos
957
+ self .freq = freq
958
+ self .tz = tz
959
+ self .index_name = None
956
960
self .table = None
957
961
958
962
if name is not None :
@@ -1023,7 +1027,22 @@ def convert(self, values, nan_rep):
1023
1027
values = values [self .cname ]
1024
1028
except :
1025
1029
pass
1026
- self .values = Index (_maybe_convert (values , self .kind ))
1030
+
1031
+ kwargs = dict ()
1032
+ if self .freq is not None :
1033
+ kwargs ['freq' ] = self .freq
1034
+ if self .tz is not None :
1035
+ kwargs ['tz' ] = self .tz
1036
+ if self .name is not None :
1037
+ kwargs ['name' ] = self .index_name
1038
+ try :
1039
+ self .values = Index (_maybe_convert (values , self .kind ), ** kwargs )
1040
+ except :
1041
+
1042
+ # if the output freq is different that what we recorded, then infer it
1043
+ if 'freq' in kwargs :
1044
+ kwargs ['freq' ] = 'infer'
1045
+ self .values = Index (_maybe_convert (values , self .kind ), ** kwargs )
1027
1046
return self
1028
1047
1029
1048
def take_data (self ):
@@ -1098,6 +1117,30 @@ def validate_attr(self, append):
1098
1117
raise TypeError ("incompatible kind in col [%s - %s]" %
1099
1118
(existing_kind , self .kind ))
1100
1119
1120
+ def update_info (self , info ):
1121
+ """ set/update the info for this indexable with the key/value
1122
+ if validate is True, then raise if an existing value does not match the value """
1123
+
1124
+ for key in ['freq' ,'tz' ,'name' ]:
1125
+
1126
+ value = getattr (self ,key ,None )
1127
+
1128
+ try :
1129
+ idx = info [self .name ]
1130
+ except :
1131
+ idx = info [self .name ] = dict ()
1132
+
1133
+ existing_value = idx .get (key )
1134
+ if key in idx and existing_value != value :
1135
+ raise ValueError ("invalid info for [%s] for [%s]" ""
1136
+ ", existing_value [%s] conflicts with new value [%s]" % (self .name ,
1137
+ key ,existing_value ,value ))
1138
+
1139
+ if value is not None or existing_value is not None :
1140
+ idx [key ] = value
1141
+
1142
+ return self
1143
+
1101
1144
def get_attr (self ):
1102
1145
""" set the kind for this colummn """
1103
1146
self .kind = getattr (self .attrs , self .kind_attr , None )
@@ -2060,6 +2103,7 @@ def __init__(self, *args, **kwargs):
2060
2103
self .non_index_axes = []
2061
2104
self .values_axes = []
2062
2105
self .data_columns = []
2106
+ self .info = dict ()
2063
2107
self .nan_rep = None
2064
2108
self .selection = None
2065
2109
@@ -2173,18 +2217,20 @@ def values_cols(self):
2173
2217
2174
2218
def set_attrs (self ):
2175
2219
""" set our table type & indexables """
2176
- self .attrs .table_type = self .table_type
2177
- self .attrs .index_cols = self .index_cols ()
2178
- self .attrs .values_cols = self .values_cols ()
2220
+ self .attrs .table_type = self .table_type
2221
+ self .attrs .index_cols = self .index_cols ()
2222
+ self .attrs .values_cols = self .values_cols ()
2179
2223
self .attrs .non_index_axes = self .non_index_axes
2180
2224
self .attrs .data_columns = self .data_columns
2181
- self .attrs .nan_rep = self .nan_rep
2182
- self .attrs .levels = self .levels
2225
+ self .attrs .info = self .info
2226
+ self .attrs .nan_rep = self .nan_rep
2227
+ self .attrs .levels = self .levels
2183
2228
2184
2229
def get_attrs (self ):
2185
2230
""" retrieve our attributes """
2186
2231
self .non_index_axes = getattr (self .attrs ,'non_index_axes' ,None ) or []
2187
2232
self .data_columns = getattr (self .attrs ,'data_columns' ,None ) or []
2233
+ self .info = getattr (self .attrs ,'info' ,None ) or dict ()
2188
2234
self .nan_rep = getattr (self .attrs ,'nan_rep' ,None )
2189
2235
self .levels = getattr (self .attrs ,'levels' ,None ) or []
2190
2236
t = self .table
@@ -2221,8 +2267,17 @@ def indexables(self):
2221
2267
d = self .description
2222
2268
self ._indexables = []
2223
2269
2270
+ # info
2271
+ info = getattr (self .attrs ,'info' ,None ) or dict ()
2272
+
2224
2273
# index columns
2225
- self ._indexables .extend ([IndexCol (name = name , axis = axis , pos = i ) for i , (axis , name ) in enumerate (self .attrs .index_cols )])
2274
+ def create_index (i , axis , name ):
2275
+ kwargs = dict ( name = name , axis = axis , pos = i )
2276
+ i = info .get (name )
2277
+ if i is not None and len (i ):
2278
+ kwargs .update (i )
2279
+ return IndexCol (** kwargs )
2280
+ self ._indexables .extend ([ create_index (i ,axis ,name ) for i , (axis , name ) in enumerate (self .attrs .index_cols )])
2226
2281
2227
2282
# values columns
2228
2283
dc = set (self .data_columns )
@@ -2379,7 +2434,8 @@ def create_axes(self, axes, obj, validate=True, nan_rep=None, data_columns=None,
2379
2434
existing_table .infer_axes ()
2380
2435
axes = [ a .axis for a in existing_table .index_axes ]
2381
2436
data_columns = existing_table .data_columns
2382
- nan_rep = existing_table .nan_rep
2437
+ nan_rep = existing_table .nan_rep
2438
+ self .info = existing_table .info
2383
2439
else :
2384
2440
existing_table = None
2385
2441
@@ -2421,7 +2477,7 @@ def create_axes(self, axes, obj, validate=True, nan_rep=None, data_columns=None,
2421
2477
self .non_index_axes .append ((i , append_axis ))
2422
2478
2423
2479
# set axis positions (based on the axes)
2424
- self .index_axes = [index_axes_map [a ].set_pos (j ) for j ,
2480
+ self .index_axes = [index_axes_map [a ].set_pos (j ). update_info ( self . info ) for j ,
2425
2481
a in enumerate (axes )]
2426
2482
j = len (self .index_axes )
2427
2483
@@ -3042,10 +3098,10 @@ class AppendableNDimTable(AppendablePanelTable):
3042
3098
def _convert_index (index ):
3043
3099
if isinstance (index , DatetimeIndex ):
3044
3100
converted = index .asi8
3045
- return IndexCol (converted , 'datetime64' , _tables ().Int64Col ())
3101
+ return IndexCol (converted , 'datetime64' , _tables ().Int64Col (), freq = getattr ( index , 'freq' , None ), tz = getattr ( index , 'tz' , None ) )
3046
3102
elif isinstance (index , (Int64Index , PeriodIndex )):
3047
3103
atom = _tables ().Int64Col ()
3048
- return IndexCol (index .values , 'integer' , atom )
3104
+ return IndexCol (index .values , 'integer' , atom , freq = getattr ( index , 'freq' , None ) )
3049
3105
3050
3106
if isinstance (index , MultiIndex ):
3051
3107
raise Exception ('MultiIndex not supported here!' )
0 commit comments