我想在 IJulia 的列上创建一个循环,但出现了这个错误。请问我该怎么做才能纠正它。
这是我的代码:
for v=1:length(col1)
col1[v] = Dates.DateTime(col1[v], "d-u-y")
end
我得到了这个错误:
setindex! not defined for WeakRefStrings.StringArray{String,1}
Stacktrace:
[1] error(::String, ::Type{T} where T) at .\error.jl:42
[2] error_if_canonical_setindex(::IndexLinear, ::WeakRefStrings.StringArray{String,1}, ::Int64) at .\abstractarray.jl:1081
[3] setindex!(::WeakRefStrings.StringArray{String,1}, ::DateTime, ::Int64) at .\abstractarray.jl:1072
[4] top-level scope at .\In[130]:2
我决定尝试使用以下方法稍微更改代码:
for i in col1
global col1[i] = Dates.DateTime(string.(col1[i]), "d-u-y")
end
然后我仍然遇到这个错误:
ArgumentError: invalid index: "4-Jul-2014" of type String
Stacktrace:
[1] to_index(::String) at .\indices.jl:297
[2] to_index(::WeakRefStrings.StringArray{String,1}, ::String) at .\indices.jl:274
[3] to_indices at .\indices.jl:325 [inlined]
[4] to_indices at .\indices.jl:322 [inlined]
[5] getindex(::WeakRefStrings.StringArray{String,1}, ::String) at .\abstractarray.jl:980
[6] top-level scope at .\In[136]:2
最佳答案
这里有两个不同的问题。第一个问题是您可能使用 CSV.read()
读取一些数据。 ,它为您提供了一组不可变的列。由于它们是不可变的,setindex!
(本质上改变内容)是不允许的。关于此的问题已得到解答here .
第二个问题不相关,是由于您现在正在迭代实际列 col1
,这样 i
不再是整数,而是取 col1
中的值,在你的情况下是 WeakRefString
。所以当你这样做 col1[i]
, i
值为 "4-Jul-2014"
,因为这是 col1
中的第一个值柱子。
无论如何,您根本不需要在这里循环,而可以简单地依赖 Julia 的广播语法,如下所示:
Date.(col1, DateFormat("d-u-y"))
Date
后面的点广播Date
col1
的每个元素的构造函数。另请注意,您可以只使用 Date
而不是DateTime
根据错误消息中显示的日期,您的数据似乎没有附加时间。
关于indexing - 设置索引!没有为 WeakRefStrings 定义。 SpringArray{字符串,1},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62372522/