我已将数据加载到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
我只想将每个元素转换为此格式并存储在数据框中
答案 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 │