如何使用Julia从.CSV文件数据中读取DateTime数据类型

时间:2018-10-11 00:08:55

标签: julia

如何使用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

3 个答案:

答案 0 :(得分:3)

您需要的图书馆(常常被遗忘,这会使学习者感到沮丧)。

# 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"

读取具有格式化日期格式并输出标准日期“ yyyy-mm-dd”的DataFrame

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

答案 1 :(得分:2)

当遇到此类转换问题时,最好稍微低一点以了解发生了什么。

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

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.DateFormat,并在stdlib/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 :(得分:1)

我认为他们更改了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)