pd.read_hdf 出现“无法将WRITABLE标志设置为此数组的True”错误。

26

运行以下代码:

pd.read_hdf('myfile.h5')

会出现以下错误回溯信息:

[[...一些更长的回溯信息]]

~/.local/lib/python3.6/site-packages/pandas/io/pytables.py in read_array(self, key, start, stop) 2487 2488 if isinstance(node, tables.VLArray): -> 2489 ret = node[0][start:stop] 2490 else: 2491 dtype = getattr(attrs, 'value_type', None)

~/.local/lib/python3.6/site-packages/tables/vlarray.py in getitem(self, key)

~/.local/lib/python3.6/site-packages/tables/vlarray.py in read(self, start, stop, step)

tables/hdf5extension.pyx in tables.hdf5extension.VLArray._read_array()

ValueError: cannot set WRITEABLE flag to True of this array

不知道出了什么问题。我已经尝试重新安装了 tables, pandas等所有东西,但它仍然无法读取。


你能用 HDFView 打开 myfile.h5 并查看数据吗?或者,你尝试过使用来自 HDF Group 的命令行实用程序 h5dump 读取文件吗?这是另一种查看文件内容的方式。你也可以尝试使用 pytables 命令行工具 ptdump。这些工具可能有助于确定问题所在。 - kcw78
当我使用h5py打开它时,我得到了键['pd']。它有4个键:<KeysViewHDF5 ['axis0','axis1','block0_items','block0_values']>。 - Landmaster
ptdump 将组结构和数据集格式转储到命令窗口(或重定向到文本文件)。如果没有错误,那就是一个好的开始。你是否看到了一些列有数据的 VLArraysh5py 是访问 HDF5 数据的不同方法。它使用类似字典的方法,其中键是您的顶级节点名称,值是对象(组或数据集)。这样做的目的是验证有效的 HDF5 文件,以便您可以专注于您的代码。 - kcw78
3个回答

21

我在使用numpy 1.15和python 3.6时仍然存在问题。但是在使用python 3.5或3.7时,问题消失了。我正在使用anaconda环境,并且使用conda-forge渠道。 - Fauzan
这个错误在numpy 1.15中消失了。但是新的错误出现了,显示为“没有名为'numpy.core._multiarray_umath'的模块”。 - Spencer
@YueDeng 这很可能是因为 hdf 文件是使用 numpy 1.16 保存的。在这种情况下,即使您降级也无法解决问题。尝试降级 numpy 并使用 1.15 再次保存 hdf 文件。然后它就可以正常工作了。 - Pekka
降级到Python 3.5版本。 - Afe
3
我正在使用 Python 3.6,并将 pytables 升级到 3.5.1 以使其正常工作;不需要重新编写 HDF 存档。 - jeschwar

18

将PyTables升级到版本> 3.5.1应该可以解决此问题。

pip install --upgrade tables

1
如果您正在使用Google Colab,请不要忘记重新启动运行时。 - Ritwik

0

看起来是由于time-date字符串引起的问题,当我将它们从文本转换为numpy (pd.to_datetime())并存储表格后,问题就消失了,所以也许与文本数据有关?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接