【问题标题】:Parsing DateTime in a CSV file in Julia在 Julia 的 CSV 文件中解析 DateTime
【发布时间】:2021-08-14 00:40:25
【问题描述】:

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

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

abc = CSV.File("ABC.csv")

格式如下:

2016-01-04T14:16:00Z,103.71,103.71,103.71,103.71,23300

我曾期望 Julia 能够识别 ISO8601 时间戳并将其解析为 DateTime,但它似乎没有这样做。生成的typeofString

因此,我的问题有两个方面:

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

【问题讨论】:

    标签: julia


    【解决方案1】:

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

    datetime,x,y,z,w,n
    2016-01-04T14:16:00Z,103.71,103.71,103.71,103.71,23300
    

    你已经知道怎么读了:

    julia> using CSV
    
    julia> csv = CSV.File("ABC.csv")
    1-element CSV.File{false}:
     CSV.Row: (datetime = "2016-01-04T14:16:00Z", x = 103.71, y = 103.71, z = 103.71, w = 103.71, n = 23300)
    

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

    julia> csv.datetime
    1-element PooledArrays.PooledVector{String, UInt32, Vector{UInt32}}:
     "2016-01-04T14:16:00Z"
    

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

    julia> using Dates
    
    julia> DateTime(csv.datetime[1], "yyyy-mm-ddTHH:MM:SSZ")
    2016-01-04T14:16:00
    

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

    julia> DateTime.(csv.datetime, "yyyy-mm-ddTHH:MM:SSZ")
    1-element Vector{DateTime}:
     2016-01-04T14:16:00
    

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

    julia> using DataFrames
    
    julia> csv |> DataFrame
    1×6 DataFrame
     Row │ datetime              x        y        z        w        n     
         │ String                Float64  Float64  Float64  Float64  Int64 
    ─────┼─────────────────────────────────────────────────────────────────
       1 │ 2016-01-04T14:16:00Z   103.71   103.71   103.71   103.71  23300
    

    总而言之,可以使用以下脚本来转换数据:

    using DataFrames
    using Dates
    using CSV
    
    df = CSV.File("ABC.txt") |> DataFrame
    
    df.datetime = DateTime.(df.datetime, "yyyy-mm-ddTHH:MM:SSZ")
    

    您可以在文档字符串?DateTime 中找到更多信息。

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

    【讨论】:

      【解决方案2】:

      您还可以使用CSV.File 函数的dateformat 选项:

      julia> DataFrame(CSV.File("file.csv",dateformat="yyyy-mm-ddTHH:MM:SSZ"))
      1×6 DataFrame
       Row │ datetime             x        y        z        w        n     
           │ DateTime…            Float64  Float64  Float64  Float64  Int64 
      ─────┼────────────────────────────────────────────────────────────────
         1 │ 2016-01-04T14:16:00   103.71   103.71   103.71   103.71  23300
      

      【讨论】:

        猜你喜欢
        • 2014-04-30
        • 2021-05-08
        • 2016-06-24
        • 2014-03-30
        • 1970-01-01
        • 2014-11-06
        • 2021-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多