gpt4 book ai didi

datetime - 如何在 Julia 中写入和读取包含日期时间列的 DataFrame

转载 作者:行者123 更新时间:2023-12-02 20:05:50 25 4
gpt4 key购买 nike

第二次更新:被用户 @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 类型(例如 Float64Int64)的向量,这种方法就可以很好地工作。然而,在实践中,我们通常希望数据帧的第一列是日期时间,它不是基本类型(尽管在未来的版本中可能会成为基本类型)。在这种情况下,上面的代码在读取操作上失败,并显示很长的错误消息(如果有人在评论中询问,我会将其添加到底部)。按照 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 包使用它。

最佳答案

当 HDF5 对特定 Julia 数据类型缺乏支持时,就会出现此错误。在这种情况下,它并不是专门使用 Datetime 的 DataFrame,而是缺乏对 Datetime 类型本身的支持。显然,当库由于某种原因无法加载类型时(其他示例为 see herehere too )。每种类型的确切原因和修复方法都不同,但报告错误会导致及时修复(见下文)。

错误

HDF5-DIAG: Error detected in HDF5 (1.8.11) thread 0:
#000: H5Dio.c line 182 in H5Dread(): can't read data
major: Dataset
minor: Read failed
#001: H5Dio.c line 438 in H5D__read(): unable to set up type info
major: Dataset
minor: Unable to initialize object
#002: H5Dio.c line 939 in H5D__typeinfo_init(): unable to convert between src and dest datatype
major: Dataset
minor: Feature is unsupported
#003: H5T.c line 4525 in H5T_path_find(): no appropriate function for conversion path
major: Datatype
minor: Unable to initialize object

历史

版本0.2.25

我建议您迁移到 Julia 版本 0.3,因为它现在处于候选发布状态,并更新您的软件包存储库。我的设置不同;我使用不同版本的 HDF5、JLD、DataFrames 和 Datetime。但话虽这么说,我所做的两个重大更改是在对 addrequire 的调用中简单地指示模块名称而不是文件名,并且使用 @read@write 宏而不是相应的函数,因为后者似乎有错误。

Version 0.3.0-rc1+4263 (2014-07-19 02:59 UTC)

Pkg.status()
- DataFrames 0.5.7
- HDF5 0.2.25
- Datetime 0.1.6

创建数据文件

using HDF5,JLD,DataFrames,Datetime

testFile = jldopen("test.jld","w")
addrequire(testFile,"DataFrames")
addrequire(testFile,"Datetime")
df = DataFrame()
df[:column1] = today()
@write testFile df
close(testFile)

重新启动 Julia 并阅读...

julia> using HDF5,JLD,DataFrames,Datetime

julia> testFile = jldopen("test.jld","r")
Julia data file version 0.0.2: test.jld

julia> @read testFile df
1x1 DataFrame
|-------|------------|
| Row # | column1 |
| 1 | 2014-07-19 |

julia> df[:column1]
1-element DataArray{Date{ISOCalendar},1}:
2014-07-19

版本 0.2.25+(预发布)

事实上,我可以确认尝试存储日期时间失败,并且使用存储库中的最新版本修复了问题。

 HDF5                          0.2.25+            master

如果仅通过将today()更改为now()来修改上述内容

df[:column1] = now()

然后是下面的

julia> using HDF5,JLD,DataFrames,Datetime

julia> testFile = jldopen("test.jld","r")
Julia data file version 0.0.2: test.jld

julia> @read testFile df
1x1 DataFrame
|-------|-------------------------|
| Row # | column1 |
| 1 | 2014-07-26T03:38:45 UTC |

但是,尽管 this fix ,但对于 Datetime 发生的相同的常见错误消息似乎也发生在复杂类型上。 .

c = 1 + im;
@write testFile c

版本0.2.26

这个版本还支持复杂的。最初看来,该问题一般是缺乏对复杂类型的支持,但更可能是从 1 + im 初始化复杂的特殊问题;而不是 1.0 + im

- HDF5                          0.2.26

julia> using HDF5, JLD

julia> testFile = jldopen("test.jld","r")
Julia data file version 0.0.2: test.jld

julia> @read testFile c
1 + 1im

关于datetime - 如何在 Julia 中写入和读取包含日期时间列的 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24820678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com