2014-09-13 44 views
2

因此,我将数据文件解析为熊猫数据框,然后使用HDFStore将文件保存到hdf5。代码:store.root.attributes not saving - 熊猫和Pytables

def convert_folder_hdf5(folder, save_loc=None): 
    if save_loc is None: 
     save_loc = folder 

    filename = save_loc+'\\' + (folder.split('\\')[-1])+'.h5' 
    store = pd.HDFStore(filename, format="table", complevel=9, complib='blosc') 
    data = import_folder(folder) 

    if data['voltage recording'] is not None: 
     store['voltage_recording'] = data['voltage recording'] 
    if data['linescan'] is not None: 
     store['linescan'] = data['linescan'] 

    store.root.attributes = data['file attributes'] 

    store.close() 

然而,我去访问store.root.attributes我给出:

tables.exceptions.NoSuchNodeError: group ``/`` does not have a child named ``attributes`` 

store.root回报(这个特定的文件夹中有没有线扫描文件):

/ (RootGroup) '' 
    children := ['voltage_recording' (Group)] 

只需在控制台中,我可以工作做手工:

store.root.attributes = data['file attributes'] 

然后,当我打电话给store.root.attributes我得到了我期待得到的。但是,如果我然后重新保存该文件,并重新打开它在store.root.attributes中设置的内容不见了(我得到与上面相同的错误)。

回答

1

您不能直接存储在节点中,而是直接存储在节点的属性部分中。从here开始,您必须实际创建一个节点并使用.attrs属性来抓取实际存储事物的位置。

这里有一个办法直接做到这一点:

In [16]: store.root._v_attrs.attributes = 'bar' 

In [17]: store.root._v_attrs 
Out[17]: 
/._v_attrs (AttributeSet), 5 attributes: 
    [CLASS := 'GROUP', 
    PYTABLES_FORMAT_VERSION := '2.1', 
    TITLE := '', 
    VERSION := '1.0', 
    attributes := 'bar'] 

熊猫还在开发一种更通用的API获取/设置属性,随意评论:https://github.com/pydata/pandas/pull/7334

此外,指定format='table'打开时HDFStore被忽略。这仅适用于to_hdf。您无法为整个商店提供格式,只需逐个对象。 http://pandas.pydata.org/pandas-docs/stable/io.html#table-format

+0

我有点困惑 - 最近做了些什么改变? 我实际上有一个关于这样做的问题,然后您的回复与我在上面的代码示例中的回复相似。 请参阅:http://stackoverflow.com/questions/25232707/performancewarning-pandas-and-pytables-cani-i-fix-this – user3014097 2014-09-16 17:01:47

+0

不知道我在想什么。在非根节点上,您*可以*(使用''.attrs'')存储。但这只适用于''store.get_storer('df')。attrs''。否则使用上面的方法。 – Jeff 2014-09-16 17:11:39