Python 具有较新参数的字符串列上的PyTables ValueError

Python 具有较新参数的字符串列上的PyTables ValueError,python,pandas,time-series,hdf5,pytables,Python,Pandas,Time Series,Hdf5,Pytables,使用pytables/tstables将数据帧时间序列写入HDF5时出现问题: import pandas import tables import tstables # example dataframe valfloat = [512.3, 918.8] valstr = ['abc','cba'] tstamp = [1445464064, 1445464013] df = pandas.DataFrame(data = zip(valfloat, valstr, tstamp), co

使用pytables/tstables将数据帧时间序列写入HDF5时出现问题:

import pandas
import tables
import tstables

# example dataframe
valfloat = [512.3, 918.8]
valstr = ['abc','cba']
tstamp = [1445464064, 1445464013]
df = pandas.DataFrame(data = zip(valfloat, valstr, tstamp), columns = ['colfloat', 'colstr', 'timestamp'])

df.set_index(pandas.to_datetime(df['timestamp'].astype(int), unit='s'), inplace=True)
df.index = df.index.tz_localize('UTC')

colsel = ['colfloat', 'colstr']
dftoadd = df[colsel].sort_index()

# try string conversion from object-type (no type mixing here ?)
##dftoadd.loc[:,'colstr'] = dftoadd['colstr'].map(str)

h5fname = 'df.h5'
# class to use as tstable description
class TsExample(tables.IsDescription):
    timestamp = tables.Int64Col(pos=0)
    colfloat = tables.Float64Col(pos=1)
    colstr = tables.StringCol(itemsize=8, pos=2)
# create new time series
h5f = tables.open_file(h5fname, 'a')
ts = h5f.create_ts('/','example',TsExample)

# append to HDF5
ts.append(dftoadd, convert_strings=True)

# save data and close file
h5f.flush()
h5f.close()
例外情况:

ValueError:rows参数无法转换为recarray对象 与位于的表tstables.tstable.tstable实例兼容。。。 错误为:无法将对象视为非对象类型

虽然这个特定的错误发生在TsTables上,但负责它的代码块与PyTables相同

错误发生在我升级到0.17.0之后;相同的代码在0.16.2中运行时没有错误

注意:如果字符串列被排除在外,则一切正常,因此此问题必须与dataframe中的字符串列类型表示有关


这一问题可能与政治有关。我缺少的数据帧的“colstr”列是否需要一些转换?

这不适用于较新的pandas,因为索引是时区感知的,请参阅

你可以:

转换为PyTables能够理解的类型,这需要本地化 使用HDFStore写入帧
请注意,您所做的是HDFStore首先存在的原因,以使读取/写入pyTables对pandas对象友好。“手动”执行此操作充满了陷阱。

我最初认为问题出在tz增强索引中,但为什么没有字符串列(即使用相同的tz感知索引,但数据帧中只有数字列)所有操作都能正常工作?