如何从 读取日期时间。带有朱莉娅的 CSV 文件数据(朱莉娅版本 1.0.1(? 如果您在这里注意到,当它读取我的数据时,它标记为"字符串"值,但我希望对 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
当面对这样的转换问题时,最好走低一点层次来了解发生了什么。
因此,我们首先从表中查找日期时间字符串
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
这里有些不太对劲。让我们查阅手册。该手册指向 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 │
你需要的库(经常被遗忘,这让学习者感到沮丧(。
# import Pkg; Pkg.add("CSV")
using CSV
# import Pkg; Pkg.add("Dates")
using Dates
# import Pkg; Pkg.add("DataFrames")
using DataFrames
日期格式取决于 CSV 文件中的原始数据。
注意:"u"代表 3 个字母的英语月份,例如"Aug. 3, 2020">
date_format="yyyy.mm.dd" # or "yyyy-mm-dd" or "u. dd, yyyy"
使用格式化日期格式读取数据帧,输出标准日期"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
我认为他们在 Julia 1.0 中更改了宏,因此日期格式语句形式为
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)