@@ -4093,6 +4093,8 @@ def _create_axes(
4093
4093
ordered = data_converted .ordered
4094
4094
meta = "category"
4095
4095
metadata = np .asarray (data_converted .categories ).ravel ()
4096
+ elif isinstance (blk .dtype , StringDtype ):
4097
+ meta = str (blk .dtype )
4096
4098
4097
4099
data , dtype_name = _get_data_and_dtype_name (data_converted )
4098
4100
@@ -4360,7 +4362,9 @@ def read_column(
4360
4362
encoding = self .encoding ,
4361
4363
errors = self .errors ,
4362
4364
)
4363
- return Series (_set_tz (col_values [1 ], a .tz ), name = column , copy = False )
4365
+ cvs = _set_tz (col_values [1 ], a .tz )
4366
+ dtype = getattr (self .table .attrs , f"{ column } _meta" , None )
4367
+ return Series (cvs , name = column , copy = False , dtype = dtype )
4364
4368
4365
4369
raise KeyError (f"column [{ column } ] not found in the table" )
4366
4370
@@ -4708,8 +4712,18 @@ def read(
4708
4712
df = DataFrame ._from_arrays ([values ], columns = cols_ , index = index_ )
4709
4713
if not (using_string_dtype () and values .dtype .kind == "O" ):
4710
4714
assert (df .dtypes == values .dtype ).all (), (df .dtypes , values .dtype )
4715
+
4716
+ # If str / string dtype is stored in meta, use that.
4717
+ converted = False
4718
+ for column in cols_ :
4719
+ dtype = getattr (self .table .attrs , f"{ column } _meta" , None )
4720
+ if dtype in ["str" , "string" ]:
4721
+ df [column ] = df [column ].astype (dtype )
4722
+ converted = True
4723
+ # Otherwise try inference.
4711
4724
if (
4712
- using_string_dtype ()
4725
+ not converted
4726
+ and using_string_dtype ()
4713
4727
and isinstance (values , np .ndarray )
4714
4728
and is_string_array (
4715
4729
values ,
0 commit comments