如何从 读取 DateTime 数据类型.带有朱莉娅的 CSV 文件数据



如何从 读取日期时间。带有朱莉娅的 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)

最新更新