【问题标题】:How can I read DateTime data type from .CSV file data with Julia如何使用 Julia 从 .CSV 文件数据中读取 DateTime 数据类型
【发布时间】:2018-10-11 00:08:55
【问题描述】:

如何使用 Julia(Julia 版本 1.0.1)从 .CSV 文件数据中读取 DateTime?如果您注意到这里,当它读入我的数据时,它被标记为“字符串”值,但我希望对 head() 的调用会将 DateTime 值显示为数据类型。

我是这样读的:

using Dates, CSV, DataFrames
dfmt = dateformat"yyyy-mm-dd hh:MM:ss"
column_types = Dict(:pickup_datetime=>DateTime, :dropoff_datetime=>DateTime)
df = convert(DataFrame, CSV.read("$(Base.source_dir())/small_taxi.csv", 
  types=column_types, dateformat=dfmt))
function reduce_dataframe(data_frame)
  return data_frame[[:vendor_id, :pickup_datetime, :dropoff_datetime, 
    :passenger_count, :trip_distance]]
end
df = reduce_dataframe(df)
head(df)

这是我的程序输出(来自出租车数据):

julia> include("hello.jl")
Started ...
elapsed CPU time: 0.09325 seconds
  0.094642 seconds (548.85 k allocations: 10.445 MiB)
6×4 DataFrame
│ Row │ vendor_id │ pickup_datetime     │ dropoff_datetime    │ passenger_count │
│     │ Int64⍰    │ String⍰             │ String⍰             │ Int64⍰          │
├─────┼───────────┼─────────────────────┼─────────────────────┼─────────────────┤
│ 1   │ 1         │ 2017-01-01 01:21:25 │ 2017-01-01 01:51:56 │ 2               │
│ 2   │ 1         │ 2017-01-01 02:17:49 │ 2017-01-01 02:17:49 │ 3               │
│ 3   │ 1         │ 2017-01-01 02:30:02 │ 2017-01-01 02:52:56 │ 1               │
│ 4   │ 1         │ 2017-01-01 04:17:32 │ 2017-01-01 04:17:36 │ 1               │
│ 5   │ 1         │ 2017-01-01 04:41:54 │ 2017-01-01 05:24:22 │ 1               │
│ 6   │ 1         │ 2017-01-01 10:41:18 │ 2017-01-01 10:56:59 │ 2               │

这里的诀窍是什么?如果您想亲自尝试,这里有一些示例数据:https://gist.github.com/djangofan/09c6304b55f2a73cb05d0d2afc7902b1

【问题讨论】:

    标签: julia


    【解决方案1】:

    当遇到这样的转换问题时,最好稍微深入一点了解发生了什么。

    所以,我们首先从您的表格中查看您的日期时间字符串

    dt_str="2017-01-01 01:21:25"
    

    可以用我们的格式字符串格式化吗?

    dfmt = dateformat"yyyy-MM-dd hh:mm:ss"
    Date(dt_str,dfmt)
    

    我们得到的跑步

    ERROR: ArgumentError: Unable to parse date time. Expected directive Delim( hh:) at char 11
    

    有些地方不太对劲。让我们咨询manual。手册指向Dates.DateFormatstdlib/Dates/test/io.jl 的大量示例。

    我们注意到我们在数月、数小时和数秒内一直在使用错误的字母。我们现在测试

    dfmt = dateformat"yyyy-mm-dd HH:MM:SS"
    Date(dt_str,dfmt)
    

    这次没有错误!我们在桌子上试一试

    t_data=CSV.read("$(Base.source_dir())/small_taxi.csv", dateformat=dfmt)
    t_data[:vendor_id, :pickup_datetime, :dropoff_datetime, 
            :passenger_count, :trip_distance]
    

    我们得到

    julia> t_data[[:vendor_id, :pickup_datetime, :dropoff_datetime, 
                   :passenger_count]]
    5×4 DataFrame
    │ Row │ vendor_id │ pickup_datetime     │ dropoff_datetime    │ passenger_count │
    │     │ Int64⍰    │ DateTime⍰           │ DateTime⍰           │ Int64⍰          │
    ├─────┼───────────┼─────────────────────┼─────────────────────┼─────────────────┤
    │ 1   │ 2         │ 2017-09-23T05:08:42 │ 2017-09-23T05:27:39 │ 6               │
    │ 2   │ 1         │ 2017-07-14T19:07:38 │ 2017-07-14T19:54:17 │ 1               │
    │ 3   │ 2         │ 2017-10-29T00:42:06 │ 2017-10-29T00:43:12 │ 2               │
    │ 4   │ 2         │ 2017-10-02T20:38:17 │ 2017-10-02T21:13:09 │ 1               │
    │ 5   │ 1         │ 2017-05-11T22:53:11 │ 2017-05-11T23:27:53 │ 2               │
    

    【讨论】:

    • 这行得通。谢谢。它只是我使用的日期格式化程序中的大写。
    【解决方案2】:

    您需要的库(经常被遗忘,这让学习者感到沮丧)。

    # import Pkg; Pkg.add("CSV")
    using CSV
    
    # import Pkg; Pkg.add("Dates")
    using Dates
    
    # import Pkg; Pkg.add("DataFrames")
    using DataFrames
    

    日期格式取决于CSV文件中的原始数据。

    注意以下:“u”代表 3 个字母的英文月份,例如“2020 年 8 月 3 日”

    date_format="yyyy.mm.dd" # or "yyyy-mm-dd" or "u. dd, yyyy"
    

    用格式化日期格式读取DataFrame输出标准日期“yyyy-mm-dd”

    df = CSV.read(        # returns DataFrame
            file_path,    # URL
            dateformat="$date_format"
            )
    

    示例输出:

    82 rows × 4 columns
    
    Date    ActualValue ForecastValue   PreviousValue
    Date    Float64 Float64?    Float64?
    1   2020-08-03  44.3    34.4    42.1
    

    【讨论】:

      【解决方案3】:

      我认为他们在 Julia 1.0 中更改了宏,因此 dateformat 语句形式为

      dfmt = @dateformat_str("yyyy-mm-dd HH:MM:SS")
      

      dfmt = dateformat"yyyy-mm-dd HH:MM:SS"
      

      虽然我没有你注明日期的 CSV 文件来验证它是否有效。

      (在您编辑问题以提供文件时添加)此外,您提供的文件是制表符分隔的重复制表符,因此您需要:

      using Dates, CSV, DataFrames
      dfmt = dateformat"yyyy-mm-dd hh:MM:ss"
      df = convert(DataFrame, CSV.read("$(Base.source_dir())/small_taxi.csv", 
          dateformat=dfmt, delim="\t", ignorerepeated=true))
      function reduce_dataframe(data_frame)
          return data_frame[[:vendor_id, :pickup_datetime, :dropoff_datetime, 
              :passenger_count, :trip_distance]]
      end
      df = reduce_dataframe(df)
      head(df)
      

      【讨论】:

      • 我稍微更新了我的问题。它没有用,但我知道我一定还有一个错字。我包含了一个指向我的 CSV 示例文件的链接。
      • 您链接到的 CSV 有很多空格,并且没有逗号分隔。如果您对此进行调整,它可以在没有 column_types 部分的情况下工作: as df = convert(DataFrame, CSV.read("$(Base.source_dir())/small_taxi.csv", dateformat=dfmt))
      • 更正了最新答案中格式的时间属性的情况——在给定选项卡式格式和您的原始代码的情况下,我试图让 CSV 完全加载。
      猜你喜欢
      • 1970-01-01
      • 2011-11-17
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 2019-09-17
      相关资源
      最近更新 更多