具有较新pandas的字符串列上的PyTables ValueError

时间:2015-10-22 00:21:09

标签: python pandas time-series hdf5 pytables

使用pytables / tstables将pandas dataframe(timeseries)写入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实例...   错误是:cannot view Object as non-Object type

虽然TsTables发生了这个特殊错误,但是负责它的代码块与PyTables try-section here相同。

将pandas 升级为0.17.0后发生错误;相同的代码与0.16.2无差错运行。

注意:如果排除字符串列,那么一切正常,所以此问题必须与数据框中的字符串列类型表示有关。

该问题可能与this question有关。我缺少数据框的'colstr'列是否需要进行一些转换?

1 个答案:

答案 0 :(得分:0)

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

你可以:

  • 转换为PyTables理解的类型,这需要本地化
  • 使用HDFStore编写框架

请注意,您正在做的是首先存在HDFStore的原因,以使pandas对象的读/写pyTables友好。 “手动”这样做会充满陷阱。