使用 Pandas、Python 将数据附加到 HDF5 文件

Posted

技术标签:

【中文标题】使用 Pandas、Python 将数据附加到 HDF5 文件【英文标题】:Append data to HDF5 file with Pandas, Python 【发布时间】:2018-02-22 16:07:25 【问题描述】:

我有带有财务数据的大型熊猫数据框。 将其他列和 DataFrame 添加和连接到我的 .h5 文件中没有问题。

财务数据每分钟更新一次,我需要每分钟将一行数据附加到 .h5 文件内的所有现有表中。

这是我迄今为止尝试过的,但无论我做什么,它都会覆盖 .h5 文件,而不仅仅是附加数据。

HDF存储方式:

#we open the hdf5 file
save_hdf = HDFStore('test.h5') 

ohlcv_candle.to_hdf('test.h5')

#we give the dataframe a key value
#format=table so we can append data
save_hdf.put('name_of_frame',ohlcv_candle, format='table',  data_columns=True)

#we print our dataframe by calling the hdf file with the key
#just doing this as a test
print(save_hdf['name_of_frame'])    

我试过的另一种方式,to_hdf:

#format=t so we can append data , mode=r+ to specify the file exists and
#we want to append to it
tohlcv_candle.to_hdf('test.h5',key='this_is_a_key', mode='r+', format='t')

#again just printing to check if it worked 
print(pd.read_hdf('test.h5', key='this_is_a_key'))

这是其中一个 DataFrame 在被 read_hdf 后的样子:

           time     open     high      low    close     volume           PP  
0    1505305260  3137.89  3147.15  3121.17  3146.94   6.205397  3138.420000   
1    1505305320  3146.86  3159.99  3130.00  3159.88   8.935962  3149.956667   
2    1505305380  3159.96  3160.00  3159.37  3159.66   4.524017  3159.676667   
3    1505305440  3159.66  3175.51  3151.08  3175.51   8.717610  3167.366667   
4    1505305500  3175.25  3175.53  3170.44  3175.53   3.187453  3173.833333  

下次我获取数据时(每分钟),我希望将其中的一行添加到我所有列的索引 5 中……然后是 6 和 7 ……依此类推,而无需读取和操作整个文件都在内存中,因为那样会破坏这样做的意义。 如果有更好的方法来解决这个问题,请不要害羞地推荐它。

附:抱歉这里的表格格式

【问题讨论】:

【参考方案1】:

pandas.HDFStore.put() 有参数 append(默认为 False)——指示 Pandas 覆盖而不是追加。

所以试试这个:

store = pd.HDFStore('test.h5')

store.append('name_of_frame', ohlcv_candle, format='t',  data_columns=True)

我们也可以使用store.put(..., append=True),但是这个文件也应该是表格格式的:

store.put('name_of_frame', ohlcv_candle, format='t', append=True, data_columns=True)

注意:附加仅适用于 tableformat='t' - 是 format='table' 的别名)格式。

【讨论】:

就是这样,非常感谢您的快速回答! @Karl,很高兴我能帮上忙 :) 您能否解释一下为什么append 有效而put 无效? 请务必注意,追加仅适用于 format = 'table'。默认的“固定”格式不可附加(也不可搜索) - 请参阅 pandas.pydata.org/pandas-docs/stable/generated/…【参考方案2】:
tohlcv_candle.to_hdf('test.h5',key='this_is_a_key', append=True, mode='r+', format='t')

您需要传递另一个参数 append=True 来指定如果在该键下找到数据,则将其附加到现有数据中,而不是覆盖它。

没有这个,默认为False,如果遇到'this_is_a_key'下的现有表,则覆盖。

mode= 参数仅在文件级别,告诉文件作为一个整体是被覆盖还是附加。

一个文件可以有任意数量的键,因此mode='a', append=False 设置意味着只有一个键被覆盖,而其他键保持不变。

我有与您类似的经历,并在参考文档中找到了附加的附加参数。设置后,现在它对我来说是正确的。

参考:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_hdf.html

注意:hdf5 不会对数据帧的索引做任何事情。我们需要在将数据放入或取出数据之前解决这些问题。

【讨论】:

以上是关于使用 Pandas、Python 将数据附加到 HDF5 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中使用 Pandas 数据结构附加多个 CSV 文件

python - 如何将 numpy 数组附加到 pandas 数据帧

python将多个excel中的所有工作表附加到pandas数据框中的有效方法

如何将 Python 字典附加到 Pandas DataFrame,将键与列名匹配

Python Pandas Dataframe:如何同时将多个索引附加到列表中?

无法在 python pandas 数据框中附加嵌套的 JSON 值