传递矢量或数据帧列字符串日期转换为日期格式

时间:2018-04-05 20:00:18

标签: julia

我已将数据加载到Julia中的.csv中。

我希望将字符串Date转换为Date格式:

julia> head(df)
6×7 DataFrames.DataFrame
│ Row │ Date       │ Open    │ High    │ Low     │ Close   │ Adj_Close │ Volume  │
├─────┼────────────┼─────────┼─────────┼─────────┼─────────┼───────────┼─────────┤
│ 1   │ 1993-01-29 │ 43.9687 │ 43.9687 │ 43.75   │ 43.9375 │ 27.6073   │ 1003200 │
│ 2   │ 1993-02-01 │ 43.9687 │ 44.25   │ 43.9687 │ 44.25   │ 27.8036   │ 480500  │
│ 3   │ 1993-02-02 │ 44.2187 │ 44.375  │ 44.125  │ 44.3437 │ 27.8625   │ 201300  │
│ 4   │ 1993-02-03 │ 44.4062 │ 44.8437 │ 44.375  │ 44.8125 │ 28.1571   │ 529400  │
│ 5   │ 1993-02-04 │ 44.9687 │ 45.0937 │ 44.4687 │ 45.0    │ 28.2749   │ 531500  │
│ 6   │ 1993-02-05 │ 44.9687 │ 45.0625 │ 44.7187 │ 44.9687 │ 28.2552   │ 492100  │

类型是:

julia> showcols(df)
6258×7 DataFrames.DataFrame
│ Col # │ Name      │ Eltype                           │ Missing │ Values                    │
├───────┼───────────┼──────────────────────────────────┼─────────┼───────────────────────────┤
│ 1     │ Date      │ Union{Missings.Missing, String}  │ 0       │ 1993-01-29  …  2017-12-01 │
│ 2     │ Open      │ Union{Float64, Missings.Missing} │ 0       │ 43.9687  …  264.76        │
│ 3     │ High      │ Union{Float64, Missings.Missing} │ 0       │ 43.9687  …  265.31        │
│ 4     │ Low       │ Union{Float64, Missings.Missing} │ 0       │ 43.75  …  260.76          │
│ 5     │ Close     │ Union{Float64, Missings.Missing} │ 0       │ 43.9375  …  264.46        │
│ 6     │ Adj_Close │ Union{Float64, Missings.Missing} │ 0       │ 27.6073  …  264.46        │
│ 7     │ Volume    │ Union{Int64, Missings.Missing}   │ 0       │ 1003200  …  159947700     │

现在Date是一个字符串。

所以希望将列转换为Date格式。

尝试:

df[:Date, DateFormat("yyyy-mm-dd")]

df[df[:Date] = DateFormat("yyyy-mm-dd")]

有错误:

MethodError:不能convert DateFormat类型的对象{Symbol(“yyyy-mm-dd”),Tuple {Base.Dates.DatePart {'y'},Base.Dates.Delim {Char,1 },Base.Dates.DatePart {'m'},Base.Dates.Delim {Char,1},Base.Dates.DatePart {'d'}}}到String类型的对象 这可能是由对构造函数String(...)的调用引起的, 因为类型构造函数回退到转换方法。 在setindex!在DataFrames \ src \ dataframe \ dataframe.jl:376 填写!在base \ multidimensional.jl:841 REPL

包含我的语法错误我从日期列中创建了一个向量x:

x = df[:Date]

Date(x, "yyyy-mm-dd")

MethodError:无法convert类型为Array {Union {Missings.Missing,String},1}的对象到Int64类型的对象 REPL

这很容易用R但是朱莉娅无法找到那么多的信息,任何帮助都表示赞赏。

我也在关注此链接:

https://docs.julialang.org/en/release-0.4/manual/dates/

以下是一个例子:

julia> df = Dates.DateFormat("y-m-d");

julia> dt = Date("2015-01-01",df)
2015-01-01

julia> dt2 = Date("2015-01-02",df)
2015-01-02

为什么我不能通过这个传递矢量或数据帧列?

更新

当我从向量传递一个元素时,这是有效的:

julia> Date(x[1], Dates.DateFormat("yyyy-mm-dd"))
1993-01-29

我只想将每个元素转换为此格式并存储在数据框中

2 个答案:

答案 0 :(得分:2)

只需写下Date.(x, Dates.DateFormat("yyyy-mm-dd"))即可获得所需内容。

注意.之后的Date - 它告诉Julia将Date函数应用于x的所有元素,Dates.DateFormat("yyyy-mm-dd")将在每次调用中重复使用它是一个标量。

详情请见https://docs.julialang.org/en/latest/base/arrays/#Broadcast-and-vectorization-1

如果您使用最新版本的 CSV.jl 软件包,请注意,它应自动检测Date类型:

julia> data="""Date,Open,High,Low,Close,Adj_Close,Volume
       1993-01-29,43.9687,43.9687,43.75,43.9375,27.6073,1003200
       1993-02-01,43.9687,44.25,43.9687,44.25,27.8036,480500
       1993-02-02,44.2187,44.375,44.125 ,44.3437,27.8625,201300"""
"Date,Open,High,Low,Close,Adj_Close,Volume\n1993-01-29,43.9687,43.9687,43.75,43.9375,27.6073,1003200\n1993-02-01,43.9687,44.25,43.9687,44.25,27.8036,480500\n1993-02-02,44.2187,44.375,44.125 ,44.3437,27.8625,201300"

julia> showcols(CSV.read(IOBuffer(data)))
3×7 DataFrames.DataFrame
│ Col # │ Name      │ Eltype                           │ Missing │ Values                    │
├───────┼───────────┼──────────────────────────────────┼─────────┼───────────────────────────┤
│ 1     │ Date      │ Union{Date, Missings.Missing}    │ 0       │ 1993-01-29  …  1993-02-02 │
│ 2     │ Open      │ Union{Float64, Missings.Missing} │ 0       │ 43.9687  …  44.2187       │
│ 3     │ High      │ Union{Float64, Missings.Missing} │ 0       │ 43.9687  …  44.375        │
│ 4     │ Low       │ Union{Float64, Missings.Missing} │ 0       │ 43.75  …  44.125          │
│ 5     │ Close     │ Union{Float64, Missings.Missing} │ 0       │ 43.9375  …  44.3437       │
│ 6     │ Adj_Close │ Union{Float64, Missings.Missing} │ 0       │ 27.6073  …  27.8625       │
│ 7     │ Volume    │ Union{Int64, Missings.Missing}   │ 0       │ 1003200  …  201300        │

即使它不会,你也可以通过types参数(例如下面的例子,如果你出于某些原因不想要这个,那么就避免与Missing建立联盟):

julia> showcols(CSV.read(IOBuffer(data), types=[String; fill(Float64, 5); Int]))
3×7 DataFrames.DataFrame
│ Col # │ Name      │ Eltype  │ Missing │ Values                    │
├───────┼───────────┼─────────┼─────────┼───────────────────────────┤
│ 1     │ Date      │ String  │ 0       │ 1993-01-29  …  1993-02-02 │
│ 2     │ Open      │ Float64 │ 0       │ 43.9687  …  44.2187       │
│ 3     │ High      │ Float64 │ 0       │ 43.9687  …  44.375        │
│ 4     │ Low       │ Float64 │ 0       │ 43.75  …  44.125          │
│ 5     │ Close     │ Float64 │ 0       │ 43.9375  …  44.3437       │
│ 6     │ Adj_Close │ Float64 │ 0       │ 27.6073  …  27.8625       │
│ 7     │ Volume    │ Int64   │ 0       │ 1003200  …  201300        │

编辑:在DataFrames.jl版本0.14或更高版本下使用describe代替showcols

答案 1 :(得分:0)

以下是我提出的建议:

# Pull date column and store in vector
    x = df[:Date]

    # loop to iterate through each element in vector, converting to Date format 
    v = []
    for i in 1:length(x)
        z = Date(x[i], Dates.DateFormat("yyyy-mm-dd"))
        push!(v,z)
    end

    # Check format 
    julia> v[1] - v[3]
    -4 days

    # cbind() R equivalent hcat() to existing data frame
    df = hcat(df,v)

With the output:


    julia> head(df)
    6×8 DataFrames.DataFrame
    │ Row │ Date       │ Open    │ High    │ Low     │ Close   │ Adj_Close │ Volume  │ x1         │
    ├─────┼────────────┼─────────┼─────────┼─────────┼─────────┼───────────┼─────────┼────────────┤
    │ 1   │ 1993-01-29 │ 43.9687 │ 43.9687 │ 43.75   │ 43.9375 │ 27.6073   │ 1003200 │ 1993-01-29 │
    │ 2   │ 1993-02-01 │ 43.9687 │ 44.25   │ 43.9687 │ 44.25   │ 27.8036   │ 480500  │ 1993-02-01 │
    │ 3   │ 1993-02-02 │ 44.2187 │ 44.375  │ 44.125  │ 44.3437 │ 27.8625   │ 201300  │ 1993-02-02 │
    │ 4   │ 1993-02-03 │ 44.4062 │ 44.8437 │ 44.375  │ 44.8125 │ 28.1571   │ 529400  │ 1993-02-03 │
    │ 5   │ 1993-02-04 │ 44.9687 │ 45.0937 │ 44.4687 │ 45.0    │ 28.2749   │ 531500  │ 1993-02-04 │
    │ 6   │ 1993-02-05 │ 44.9687 │ 45.0625 │ 44.7187 │ 44.9687 │ 28.2552   │ 492100  │ 1993-02-05 │