在 Julia 中解析 CSV 文件中的日期时间

cjm*_*671 5 julia

我是 Julia 的新手,所以只是了解基础知识。

我正在尝试将 CSV 文件读入 DataFrame:

abc = CSV.File("ABC.csv")
Run Code Online (Sandbox Code Playgroud)

格式如下:

2016-01-04T14:16:00Z,103.71,103.71,103.71,103.71,23300
Run Code Online (Sandbox Code Playgroud)

我原本期望 Julia 能够识别 ISO8601 时间戳并将其解析为DateTime,但它似乎并没有做到这一点。结果typeofString.

因此,我的问题有两个:

  • 如何让 CSV.jl 在导入时解析 DateTime?
  • 如何从字符串实例化 DateTime。

jul*_*ohm 3

您需要Dates标准库。假设您有以下ABC.csv文件:

\n
datetime,x,y,z,w,n\n2016-01-04T14:16:00Z,103.71,103.71,103.71,103.71,23300\n
Run Code Online (Sandbox Code Playgroud)\n

您已经知道如何阅读它:

\n
julia> using CSV\n\njulia> csv = CSV.File("ABC.csv")\n1-element CSV.File{false}:\n CSV.Row: (datetime = "2016-01-04T14:16:00Z", x = 103.71, y = 103.71, z = 103.71, w = 103.71, n = 23300)\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,您可以使用以下方式访问列:

\n
julia> csv.datetime\n1-element PooledArrays.PooledVector{String, UInt32, Vector{UInt32}}:\n "2016-01-04T14:16:00Z"\n
Run Code Online (Sandbox Code Playgroud)\n

此格式并不完全是默认支持的 ISO 格式。您可以使用以下方法将其转换为日期时间对象:

\n
julia> using Dates\n\njulia> DateTime(csv.datetime[1], "yyyy-mm-ddTHH:MM:SSZ")\n2016-01-04T14:16:00\n
Run Code Online (Sandbox Code Playgroud)\n

现在我们知道如何转换列的单个条目,我们可以使用 Julia 的广播语法来应用于所有条目:

\n
julia> DateTime.(csv.datetime, "yyyy-mm-ddTHH:MM:SSZ")\n1-element Vector{DateTime}:\n 2016-01-04T14:16:00\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您可以将结果列保存在新表中。在 Julia 中,CSV.jl 表与最流行的 DataFrames.jl 表不同。您可以在开始处理管道之前轻松转换为它:

\n
julia> using DataFrames\n\njulia> csv |> DataFrame\n1\xc3\x976 DataFrame\n Row \xe2\x94\x82 datetime              x        y        z        w        n     \n     \xe2\x94\x82 String                Float64  Float64  Float64  Float64  Int64 \n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 2016-01-04T14:16:00Z   103.71   103.71   103.71   103.71  23300\n
Run Code Online (Sandbox Code Playgroud)\n

综上所述,可以使用以下脚本来转换数据:

\n
using DataFrames\nusing Dates\nusing CSV\n\ndf = CSV.File("ABC.txt") |> DataFrame\n\ndf.datetime = DateTime.(df.datetime, "yyyy-mm-ddTHH:MM:SSZ")\n
Run Code Online (Sandbox Code Playgroud)\n

您可以在 docstring 中找到更多信息?DateTime

\n

可能存在另一种解决方案,您可以使用关键字选项告知 CSV.jl 正确的类型types。检查文档字符串?CSV.File

\n