Julia 传递向量或数据帧列字符串日期转换为日期格式
我已在Julia中将数据加载到.csv中 我希望将字符串日期转换为日期格式:Julia 传递向量或数据帧列字符串日期转换为日期格式,julia,Julia,我已在Julia中将数据加载到.csv中 我希望将字符串日期转换为日期格式: julia> head(df) 6×7 DataFrames.DataFrame │ Row │ Date │ Open │ High │ Low │ Close │ Adj_Close │ Volume │ ├─────┼────────────┼─────────┼─────────┼─────────┼─────────┼───────────┼─────────┤ │
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 │
现在日期是一个字符串
因此,我们希望将该列转换为日期格式
尝试:
df[:Date, DateFormat("yyyy-mm-dd")]
及
有误:
MethodError:无法将类型为DateFormat{Symbol(“yyyy mm dd”)、元组{Base.Dates.DatePart{y'}、Base.Dates.Delim{Char,1}、Base.Dates.DatePart{m'}、Base.Dates.Delim{Char 1}、Base.Dates.DatePart{d'}的对象转换为字符串类型的对象
这可能是由于调用构造函数字符串(…),
因为类型构造函数会退回到转换方法。
在setindex中!在DataFrames\src\dataframe\dataframe.jl:376
填满!在底部\多维.jl:841
答复
encase我的语法错误我从date列生成一个向量x:
x = df[:Date]
Date(x, "yyyy-mm-dd")
MethodError:无法将类型为Array{Union{Missings.Missing,String},1}的对象转换为类型为Int64的对象
答复
这对R来说很容易,但是Julia找不到那么多信息,任何帮助都很感激
我也关注这个链接:
以下是一个例子:
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
我只想将每个元素转换成这种格式并存储在数据框中只需编写Date.(x,Dates.DateFormat(“yyyy-mm-dd”)
即可获得所需内容
请注意日期之后的
-它告诉Julia将日期
函数应用于x
和日期的所有元素。DateFormat(“yyyy-mm-dd”)
将在每次调用中重复使用,因为它是标量
细节在这里解释
作为旁注,如果您使用最新版本的CSV.jl软件包,则它应自动检测<代码>日期代码>类型:
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 │
即使不需要,您也可以传递类型
参数(在下面的示例中,如果您出于某种原因不希望使用缺失
,它可以避免与该参数的联合):
编辑:在DataFrames.jl版本0.14或更高版本下,使用description
而不是showcols
以下是我的想法:
# 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 │
如果不使用hcat
,可能更简单的方法是df[:newdate]=v
。另外,vectorv
具有类型vector{Any}
,您可能需要一个类型vector{Date}
,在这种情况下,您应该编写v=Date[]
。太棒了!非常感谢。所以我在这里预先指定了类型OK很好!你能给我一个语法来直接在数据框中转换它吗?df[:Date]=Date.(df[:Date])谢谢你今天的帮助。我从R到Julia的第一次尝试:)我尝试了这个,得到了MethodError:没有方法匹配iterate(::DataFrame)
你到底尝试了什么?问题是关于DateFromat
而不是DataFrames。还要注意,DataFrames.jl中现在不推荐使用
showcols',您应该使用description
函数。我已经在答案中添加了信息。根据您发布的链接,请注意您似乎正在阅读julia v0.4中的文档。自v0.4以来发生了很多变化,例如广播运营商
在提供的(非常好的)答案中。如果你刚刚遇到julia,最好阅读标有stable的文档并使用v0.6。(虽然v0.7应该很快就准备好,并且涉及到v0.6的许多更改-但它也将与v1.0兼容,因此应该是用户多年来必须处理的最后一大组突破性更改)。好的,很好-感谢您指出这一点。许多谷歌搜索导致了v.04。干杯,安德鲁
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 │
# 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 │