Julia TimeArray构造函数中的“ ArgumentError:时间戳记必须严格单调”

时间:2019-12-25 02:10:10

标签: julia

我想找出导致此错误的重复数据在哪里,但是怎么办?

using DataFrames, TimeSeries
df = DataFrame(timestamp=[Date(2019, 12, 25), Date(2020,1,1), Date(2019, 12, 25)], V=[3, 6, 9])
TimeArray(df)

错误消息

ERROR: UndefKeywordError: keyword argument timestamp not assigned
Stacktrace:
 [1] TimeArray(::DataFrame) at /home/dlin/.julia/packages/TimeSeries/8Z5Is/src/tables.jl:61
 [2] top-level scope at REPL[11]:1

预期输出可能类似于

│ Row │ timestamp  │ V     │
│     │ Date       │ Int64 │
├─────┼────────────┼───────┤
│ 1   │ 2019-12-25 │ 3     │
│ 3   │ 2019-12-25 │ 9     │

2 个答案:

答案 0 :(得分:0)

删除重复项,然后将DataFrame传递给TimeArray

julia> TimeArray(aggregate(df, :timestamp, minimum, sort=true), timestamp=:timestamp)
2×1 TimeArray{Int64,1,Date,Array{Int64,1}} 2019-12-25 to 2020-01-01
│            │ V_minimum │
├────────────┼───────────┤
│ 2019-12-25 │ 3         │
│ 2020-01-01 │ 6         │

如果您有DataFrame,并且只想标识重复的日期值,请使用nonunique函数。

julia> nonunique(df,:timestamp)
3-element Array{Bool,1}:
 0
 0
 1

如果只希望日期唯一的行:

julia> unique(df,:timestamp)
2×2 DataFrame
│ Row │ timestamp  │ V     │
│     │ Date       │ Int64 │
├─────┼────────────┼───────┤
│ 1   │ 2019-12-25 │ 3     │
│ 2   │ 2020-01-01 │ 6     │

答案 1 :(得分:0)

通过@Przemyslaw Szufel的答案,我找到了查找内容的方法,但它仍然不完美,它不能显示原始行索引,而只能显示第一个非唯一内容。

julia> v=nonunique(df,1)
8-element Array{Bool,1}:
 0
 0
 1
 0
 0
 0
 1
 1

julia> f=findfirst(v)
3
julia> df[df.Column1 .== df.Column1[f],:]
2×2 DataFrame
│ Row │ Column1    │ Column2 │
│     │ Date       │ Int64   │
├─────┼────────────┼─────────┤
│ 1   │ 2019-12-25 │ 3       │
│ 2   │ 2019-12-25 │ 9       │

顺便说一句,在检查timearray.jl的源代码后,我发现“ ArgumentError:时间戳必须严格单调”消息不仅是单调的,而且还是“排序的”消息。