标签: hdf5

如何在hdf5中高效保存python pandas数据帧并将其作为R中的数据帧打开?

我认为标题涵盖了这个问题,但要阐明:

熊猫 Python包具有用于在python保持表数据的数据帧的数据类型.它还有一个方便的hdf5文件格式接口,所以pandas DataFrames(和其他数据)可以使用简单的类似dict的界面保存(假设你安装了pytables)

import pandas 
import numpy
d = pandas.HDFStore('data.h5')
d['testdata'] = pandas.DataFrame({'N': numpy.random.randn(5)})
d.close()
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是,如果我然后尝试将相同的hdf5加载到RI中,请看事情并非如此简单:

> library(hdf5)
> hdf5load('data.h5')
NULL
> testdata
$block0_values
         [,1]      [,2]      [,3]       [,4]      [,5]
[1,] 1.498147 0.8843877 -1.081656 0.08717049 -1.302641
attr(,"CLASS")
[1] "ARRAY"
attr(,"VERSION")
[1] "2.3"
attr(,"TITLE")
[1] ""
attr(,"FLAVOR")
[1] "numpy"

$block0_items
[1] "N"
attr(,"CLASS")
[1] "ARRAY"
attr(,"VERSION")
[1] "2.3"
attr(,"TITLE")
[1] ""
attr(,"FLAVOR")
[1] "numpy"
attr(,"kind")
[1] "string"
attr(,"name")
[1] "N."

$axis1
[1] 0 1 2 3 …
Run Code Online (Sandbox Code Playgroud)

python r hdf5 pandas data.table

13
推荐指数
2
解决办法
1万
查看次数

更新h5py数据集

有没有人想从h5py更新hdf5数据集?假设我们创建了一个数据集,如:

import h5py
import numpy
f = h5py.File('myfile.hdf5')
dset = f.create_dataset('mydataset', data=numpy.ones((2,2),"=i4"))
new_dset_value=numpy.zeros((3,3),"=i4")
Run Code Online (Sandbox Code Playgroud)

是否可以将dset扩展为3x3 numpy阵列?

python hdf5 h5py

13
推荐指数
1
解决办法
1万
查看次数

在HDF5中存储Pandas对象以及常规Python对象

Pandas有一个很好的界面,便于在HDF5中存储Dataframes和Series等内容:

random_matrix  = np.random.random_integers(0,10, m_size)
my_dataframe =  pd.DataFrame(random_matrix)

store = pd.HDFStore('some_file.h5',complevel=9, complib='bzip2')
store['my_dataframe'] = my_dataframe
store.close()
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试在同一个文件中保存一些其他常规Python对象,它会抱怨:

my_dictionary = dict()
my_dictionary['a'] = 2           # <--- ERROR
my_dictionary['b'] = [2,3,4]

store['my_dictionary'] = my_dictionary
store.close()
Run Code Online (Sandbox Code Playgroud)

TypeError: cannot properly create the storer for: [_TYPE_MAP] [group->/par
ameters (Group) u'',value-><type 'dict'>,table->None,append->False,kwargs-
>{}]                                   
Run Code Online (Sandbox Code Playgroud)

如何在我存储其他Pandas对象的同一HDF5中存储常规Python数据结构?

python hdf5 pandas

13
推荐指数
1
解决办法
5874
查看次数

将字典保存到文件(numpy和Python 2/3友好)

我想在Python中进行分层键值存储,这基本上归结为将字典存储到文件中.我指的是任何类型的字典结构,可能包含其他字典,numpy数组,可序列化的Python对象等等.不仅如此,我希望它存储空间优化的numpy数组,并在Python 2和3之间发挥很好的作用.

以下是我所知道的方法.我的问题是这个清单中缺少什么,是否有一个替代方案可以躲过我所有的交易破坏者?

  • Python的pickle模块(交易破坏者:大量膨胀numpy数组的大小)
  • NumPy的的save/ savez/ load(致命弱点:不同的Python 2/3格式不兼容)
  • 替换numpy.savez的PyTables(交易破坏者:只处理numpy数组)
  • 手动使用PyTables(交易破坏者:我希望这可以不断更改研究代码,因此通过调用单个函数将字典转储到文件非常方便)

PyTables的替代numpy.savez是有希望的,因为我喜欢使用hdf5的想法,它真的有效地压缩numpy数组,这是一个很大的优点.但是,它不需要任何类型的字典结构.

最近,我一直在做的是使用类似于PyTables替换的东西,但增强它以便能够存储任何类型的条目.这实际上工作得很好,但我发现自己在长度为1的CArrays中存储原始数据类型,这有点尴尬(并且对于实际的长度为1的数组来说是模棱两可的),即使我设置chunksize为1因此它不会占用很多空间.

那里有类似的东西吗?

谢谢!

python numpy hdf5 pytables python-3.x

13
推荐指数
1
解决办法
5004
查看次数

从netCDF更快地阅读时间序列?

我有一些大的netCDF文件,包含0.5度分辨率的地球的6小时数据.

每年有360个纬度点,720个经度点和1420个时间点.我有两个年度文件(12 GB ea)和一个110年数据(1.3 TB)的文件存储为netCDF-4(这里是1901年数据的一个例子,1901.nc,它的使用政策,以及原始,公共我开始使用的文件).

根据我的理解,从一个netCDF文件中读取它应该更快,而不是循环遍历由year和最初提供的变量分隔的文件集.

我想提取每个网格点的时间序列,例如从特定纬度和经度开始10或30年.但是,我发现这很慢.例如,从点位置读取10个值需要0.01秒,尽管我可以在0.002秒内从单个时间点读取10000个值的全局切片(维度的顺序是lat,lon,时间):

## a time series of 10 points from one location:
library(ncdf4)
met.nc <- nc_open("1901.nc")
system.time(a <- ncvar_get(met.nc, "lwdown", start = c(100,100,1), 
                                             count = c(1,1,10)))
   user  system elapsed 
  0.001   0.000   0.090 

## close down session

## a global slice of 10k points from one time
library(ncdf4)
system.time(met.nc <- nc_open("1901.nc"))
system.time(a <- ncvar_get(met.nc, "lwdown", start = c(100,100,1), 
                                             count = c(100,100,1)))
   user  system elapsed 
  0.002   0.000   0.002 
Run Code Online (Sandbox Code Playgroud)

我怀疑这些文件是为了优化空间层的读取而编写的,因为a)变量的顺序是lat,lon,time,b)这将是生成这些文件的气候模型的逻辑顺序和c)因为全局范围是最常见的可视化. …

io performance r hdf5 netcdf

13
推荐指数
1
解决办法
3891
查看次数

关闭打开的h5py数据文件

在我们的实验室中,我们hdf5通过python包将数据存储在文件中h5py.

在实验开始时,我们在hdf5文件中的数组数组(以及其他内容)之后创建文件和存储数组.当实验失败或被中断时,文件未正确关闭.因为我们的实验从iPython对数据对象的引用运行在内存中(某处).

有没有办法扫描所有打开的h5py数据对象并关闭它们?

python hdf5 ipython h5py

13
推荐指数
2
解决办法
1万
查看次数

当用"pandas.read_hdf()"读取巨大的HDF5文件时,为什么我仍然得到MemoryError,即使我通过指定chunksize来读取块?

问题描述:

我使用python pandas读取一些大的CSV文件并将其存储在HDF5文件中,生成的HDF5文件大约为10GB. 阅读时会出现问题.即使我试图以块的形式读回来,我仍然得到MemoryError.

以下是我如何创建HDF5文件:

import glob, os
import pandas as pd

hdf = pd.HDFStore('raw_sample_storage2.h5')

os.chdir("C:/RawDataCollection/raw_samples/PLB_Gate")
for filename in glob.glob("RD_*.txt"):
    raw_df = pd.read_csv(filename,
                         sep=' ',
                         header=None, 
                         names=['time', 'GW_time', 'node_id', 'X', 'Y', 'Z', 'status', 'seq', 'rssi', 'lqi'], 
                         dtype={'GW_time': uint32, 'node_id': uint8, 'X': uint16, 'Y': uint16, 'Z':uint16, 'status': uint8, 'seq': uint8, 'rssi': int8, 'lqi': uint8},
                         parse_dates=['time'], 
                         date_parser=dateparse, 
                         chunksize=50000, 
                         skip_blank_lines=True)
    for chunk in raw_df:
        hdf.append('raw_sample_all', chunk, format='table', data_columns = True, index = True, compression='blosc', complevel=9)
Run Code Online (Sandbox Code Playgroud)

以下是我如何尝试以块的形式阅读它:

for df in pd.read_hdf('raw_sample_storage2.h5','raw_sample_all', chunksize=300000):
    print(df.head(1))
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误消息: …

python hdf5 pandas

13
推荐指数
1
解决办法
1万
查看次数

在ubuntu中安装HDF5和pytables

我正在尝试tables在Ubuntu 14.04中安装软件包但是sems就像是在抱怨.

我正在尝试使用PyCharm及其软件包安装程序来安装它,但是看起来它似乎在抱怨HDF5软件包.

但是,似乎我找不到任何hdf5要安装的软件包tables.

谁能解释一下这个程序?

python hdf5 pytables ubuntu-14.04

13
推荐指数
4
解决办法
5万
查看次数

测试组存在于hdf5/c ++中

我打开现有的HDF5文件来追加数据; 我想确保调用的组/A存在后续访问.我正在寻找一种简单的方法来创建/A条件(创建并返回新组,如果不存在,或返回现有组).一种方法是测试/A存在.我怎样才能有效地做到这一点?

根据API文档,我可以这样做:

H5::H5File h5file(filename,H5F_ACC_RDWR);
H5::H5Group grp;
try{
   grp=h5file.openGroup("A");
} catch(H5::Exception& e){
   /* group does not exists, create it */
   grp=h5file.createGroup("A");
}
Run Code Online (Sandbox Code Playgroud)

但明显的丑陋来自这样一个事实,即例外用于传递信息,而这些信息根本不是特例.

H5 :: CommonFG :: getObjinfo,它似乎以这样的方式包装H5Gget_objinfo,C例程的false(不存在)返回值抛出异常; 所以再次出现同样的问题.

在这种情况下,使用C API是否干净,或者是否有一些直接设计用于测试C++ API存在的函数,我忽略了?

c++ hdf5

13
推荐指数
1
解决办法
1538
查看次数

访问 Xarray 数据集时的 HDF5 警告

我想了解导致我在以下情况下收到警告消息的原因:

在之前的操作中,我创建了一些 NetCDF 文件并使用xarray.to_netcdf().

在 jupyter 笔记本中对这些数据集进行惰性评估完全没问题,并且在以下情况下我不会收到警告/错误:

  • .nc通过打开这些文件ds = xarray.open_mfdataset('/path/to/files/*.nc')
  • 通过以下方式将尺寸数据加载到内存中ds.time.values
  • 惰性选择通过ds.sel(time=starttime)

我似乎能够在对内存加载的数据进行计算时做我想做的一切。但是,我经常在以下情况下收到相同的错误集:

  • 通过加载数据来绘图ds.sel(time=starttime).SCALAR_DATA.plot()
  • 通过提取/加载数据ts = pd.Series(ds.SCALAR_DATA.loc[:,y,x], index=other_data.index)

请注意,尽管有这些警告,我执行的操作确实会产生预期的结果(绘图、时间序列结构等)。

生成以下错误的共同点似乎是从打开的数据集中加载数据。编辑:经过一些进一步的实验,我的工作环境中的软件包版本可能会导致依赖 HDF5 的软件包版本之间发生一些冲突。

以下错误重复多次。

HDF5-DIAG: Error detected in HDF5 (1.12.2) thread 1:
  #000: H5A.c line 528 in H5Aopen_by_name(): can't open attribute
    major: Attribute
    minor: Can't open object
  #001: H5VLcallback.c line 1091 in H5VL_attr_open(): attribute open failed
    major: Virtual Object Layer
    minor: Can't open object
  #002: H5VLcallback.c line 1058 in H5VL__attr_open(): attribute open failed …
Run Code Online (Sandbox Code Playgroud)

hdf5 netcdf python-xarray netcdf4

12
推荐指数
3
解决办法
3229
查看次数