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