首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不丢失大于32位的整数的情况下加载保存在熊猫中的数据帧作为R中的HDF5文件?

如何在不丢失大于32位的整数的情况下加载保存在熊猫中的数据帧作为R中的HDF5文件?
EN

Stack Overflow用户
提问于 2017-07-13 22:41:22
回答 1查看 317关注 0票数 2

当我试图将保存在熊猫中的数据帧加载为R中的HDF5文件时,我会收到以下警告消息:

警告消息:在H5Dread(h5dataset = h5dataset,h5spaceFile = h5spaceFile,h5spaceMem = h5spaceMem )中,在将64位整数或无符号32位整数从HDF5转换为32位整数时,由整数溢出产生的NAs在R中选择位64转换=‘bit64’或位64转换=‘double’,以避免数据丢失,有关64位整数的更多信息,请参阅小编“rhdf5”。

例如,如果我用以下方式在熊猫中创建HDF5文件:

代码语言:javascript
复制
import pandas as pd

frame = pd.DataFrame({
    'time':[1234567001,1234515616515167005],
    'X2':[23.88,23.96]
},columns=['time','X2'])

store = pd.HDFStore('a.hdf5')
store['df'] =  frame
store.close()
print(frame)

返回:

代码语言:javascript
复制
                  time     X2
0           1234567001  23.88
1  1234515616515167005  23.96

试着把它加载到R中:

代码语言:javascript
复制
#source("http://bioconductor.org/biocLite.R")
#biocLite("rhdf5")
library(rhdf5)

loadhdf5data <- function(h5File) {
  # Function taken from [How can I load a data frame saved in pandas as an HDF5 file in R?](https://stackoverflow.com/a/45024089/395857)
  listing <- h5ls(h5File)
  # Find all data nodes, values are stored in *_values and corresponding column
  # titles in *_items
  data_nodes <- grep("_values", listing$name)
  name_nodes <- grep("_items", listing$name)

  data_paths = paste(listing$group[data_nodes], listing$name[data_nodes], sep = "/")
  name_paths = paste(listing$group[name_nodes], listing$name[name_nodes], sep = "/")

  columns = list()
  for (idx in seq(data_paths)) {
    print(idx)
    data <- data.frame(t(h5read(h5File, data_paths[idx])))
    names <- t(h5read(h5File, name_paths[idx],  bit64conversion='bit64'))
    #names <- t(h5read(h5File, name_paths[idx],  bit64conversion='double'))
    entry <- data.frame(data)
    colnames(entry) <- names
    columns <- append(columns, entry)
  }

  data <- data.frame(columns)

  return(data)
}

frame  = loadhdf5data("a.hdf5")

我收到这样的警告信息:

代码语言:javascript
复制
> frame = loadhdf5data("a.hdf5")
[1] 1
[1] 2
Warning message:
In H5Dread(h5dataset = h5dataset, h5spaceFile = h5spaceFile, h5spaceMem = h5spaceMem,  :
  NAs produced by integer overflow while converting 64-bit integer or unsigned 32-bit integer from HDF5 to a 32-bit integer in R. Choose bit64conversion='bit64' or bit64conversion='double' to avoid data loss and see the vignette 'rhdf5' for more details about 64-bit integers.

我可以看到其中一个时间值变成了NA:

代码语言:javascript
复制
> frame
     X2       time
1 23.88 1234567001
2 23.96         NA

我怎样才能解决这个问题?选择bit64conversion='bit64'bit64conversion='double'不会改变任何事情。

代码语言:javascript
复制
> R.version
               _                           
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          3                           
minor          4.0                         
year           2017                        
month          04                          
day            21                          
svn rev        72570                       
language       R                           
version.string R version 3.4.0 (2017-04-21)
nickname       You Stupid Darkness         
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-14 03:14:42

HDF5数据集接口文档说:

bit64conversion:定义64位整数的转换方式.在内部,R不支持64位整数.R中的所有整数都是32位整数.通过设置位64转换=‘int’,强制执行32位整数,使用数据丢失的risc,但是使用将数字表示为整数的保险。位64转换=“双”将64位整数强制为浮点数。双数可以表示不超过54位的整数,但它们不再表示为整数值。对于较大的数据,再次出现数据丢失。比特64转换=‘bit64’是推荐的胁迫方式。它将64位整数表示为包'bit64‘中定义的类'integer64’的对象。确保您已经安装了'bit64‘。数据类型'integer64‘不是基R的一部分,而是在外部包中定义的。这会在处理数据时产生意外行为。

因此,您应该安装bit64 (install.packages("bit64"))并加载它(library(bit64))。您可以检查integer64是否已加载:

代码语言:javascript
复制
> integer64
Function (length = 0) 
{
    ret <- double(length)
    oldClass(ret) <- "integer64"
    ret
}
<bytecode: 0x000000001a7a95f0>
<environment: namespace :it64>

现在你可以跑了:

代码语言:javascript
复制
library(bit64)
library(rhdf5)
loadhdf5data <- function(h5File) {

  listing <- h5ls(h5File)
  # Find all data nodes, values are stored in *_values and corresponding column
  # titles in *_items
  data_nodes <- grep("_values", listing$name)
  name_nodes <- grep("_items", listing$name)

  data_paths = paste(listing$group[data_nodes], listing$name[data_nodes], sep = "/")
  name_paths = paste(listing$group[name_nodes], listing$name[name_nodes], sep = "/")

  columns = list()
  for (idx in seq(data_paths)) {
    print(idx)
    data <- data.frame(t(h5read(h5File, data_paths[idx],  bit64conversion='bit64')))
    names <- t(h5read(h5File, name_paths[idx],  bit64conversion='bit64'))
    entry <- data.frame(data)
    colnames(entry) <- names
    columns <- append(columns, entry)
  }

  data <- data.frame(columns)

  return(data)
}


frame = loadhdf5data("a.hdf5")

这意味着:

代码语言:javascript
复制
> frame
     X2                time
1 23.88          1234567001
2 23.96 1234515616515167005
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45091991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档