【发布时间】:2014-09-09 08:04:26
【问题描述】:
第二次更新:已被用户@Matt B 确认为错误。有关详细信息,请参阅下面的答案。
更新: @waTeim 已经证明可以写入和读取包含 date 类型列的 DataFrame(在我的设置中确认)。这很重要,因为这意味着 Julia 可以写入和读取数据框列中的一些复合类型。但是,类型 datetime(与类型 date 不同)的情况仍然会引发错误,因此此时问题仍未得到解答。
在 Julia 中,使用 HDF5 和 JLD 包,可以在 .jld 文件中保存和加载 DataFrame,例如:
#Preamble
using HDF, JLD, DataFrames
filePath = "/home/colin/Test.jld";
#Save the data-frame
fid1 = jldopen(FP, "w");
write(fid1, "MyDataFrame", MyDataFrame);
close(fid1);
#Come back later and load the data-frame
fid1 = jldopen(FP, "r");
X = read(fid1, "MyDataFrame");
close(fid1);
这很好用,只要数据框的列都是基本 Julia 类型的向量,如 Float64 或 Int64。然而,在实践中,我们通常希望数据框的第一列是datetime,它不是基本类型(尽管在未来的版本中可能会成为基本类型)。在这种情况下,上面的代码在read 操作中对我来说失败,并显示一条很长的错误消息(如果有人在 cmets 中询问,我会将其添加到底部)。按照 JLD 包的文档,我在保存时尝试了以下操作:
#Save the data-frame
fid1 = jldopen(FP, "w");
addrequire(fid1, "/home/colin/.julia/v0.2/DataFrames/src/dataframe.jl")
addrequire(fid1, "/home/colin/.julia/v0.2/Datetime/src/Datetime.jl")
write(fid1, "MyDataFrame", MyDataFrame);
close(fid1);
但这没有帮助。
我是在做一些愚蠢的事情,还是这个功能根本不可用?
注意:包含 HDF5 标记是因为 JLD 包使用它。
【问题讨论】:
-
有没有机会 serialize() 和 deserialize() 做你想做的事?你不会得到 .jld 但你应该可以做 i/o。
-
@Mageek
serialize()和deserialize()可能可以工作,但从长远来看,该解决方案是不可行的,因为不同版本的 Julia 甚至是在不同版本上运行的 Julia 实例系统可能不会读回写入的相同数据。不过感谢您的想法,很抱歉我花了这么长时间才回复。 -
这是一个错误。报告于:github.com/timholy/HDF5.jl/issues/106
-
现在应该修复了!如果您仍然遇到问题,请告诉我(在标记新版本的 HDF5 之前,您可以使用
Pkg.checkout("HDF5")获取此补丁)。 -
@MattB。谢谢马特,我已经确认了我的设置的修复。现在都在工作。如果您想写一个非常简短的答案,表明这是一个错误并已修复,我会投票并给出答案。
标签: datetime dataframe hdf5 julia