我想在我的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
发布于 2020-06-14 14:46:25
这里有两个独立的问题在起作用。第一个问题是,您可能会使用CSV.read()
读入一些数据,它提供了一组不可变的列。因为它们是不可变的,所以不允许使用setindex!
(本质上是更改内容)。关于这方面的问题已经在here上得到了回答。
第二个问题是无关的,这是因为您现在正在迭代实际的列col1
,因此i
不再是一个整数,而是取col1
中的任何值,在本例中是WeakRefString
。因此,当您执行col1[i]
时,i
的值为"4-Jul-2014"
,因为这是col1
列中的第一个值。
在任何情况下,您都不需要在这里进行循环,而可以简单地依赖Julia的广播语法,如下所示:
Date.(col1, DateFormat("d-u-y"))
Date
后面的点在col1
的每个元素上广播Date
构造函数。还请注意,您可以只使用Date
而不是DateTime
,因为根据错误消息中显示的日期,您的数据看起来没有附加时间。
https://stackoverflow.com/questions/62372522
复制相似问题