【问题标题】:Methoderror: no method matching isless when using sort() on Dataframe in JuliaMethoderror:在 Julia 的 Dataframe 上使用 sort() 时没有方法匹配 isless
【发布时间】:2020-12-26 14:33:26
【问题描述】:

我有一个 Excel 文件,我将其读入数据框。

using DataFrames, XLSX
df = DataFrame(XLSX.readtable("Stocks/WIHL-Wihlborgs.xlsx", "PriceMonth")...)

│ Row │ Date       │ Openprice │ Highprice │ Lowprice │ Closeprice │ Volume   │
│     │ Any        │ Any       │ Any       │ Any      │ Any        │ Any      │
├─────┼────────────┼───────────┼───────────┼──────────┼────────────┼──────────┤
│ 1   │ 2020-12-23 │ 189.1     │ 189.7     │ 170.3    │ 181.5      │ 4170122  │
│ 2   │ 2020-11-30 │ 160.0     │ 191.6     │ 158.0    │ 189.1      │ 8006506  │
│ 3   │ 2020-10-30 │ 178.4     │ 184.3     │ 151.2    │ 160.6      │ 6760931  │
│ 4   │ 2020-09-30 │ 138.5     │ 178.8     │ 137.9    │ 177.5      │ 9005351  │
│ 5   │ 2020-08-31 │ 147.2     │ 152.1     │ 137.2    │ 138.3      │ 4865386  │

sort(df)

但是当我尝试在这个 DateFrame 上使用 sort()function 时,我得到了 LoadError: MethodError: no method matching isless(::String, ::Dates.Date)

我认为这很奇怪,因为我在同一个 excel 文件中有另一个选项卡,其中我有价格/天,并且可以正常排序。我看到的唯一区别是,在 Excel 文件中,价格/月选项卡的日期字段为日期,价格/日期选项卡的日期字段为任意。但在 DataFrame 中,两个选项卡都将 Date 字段标记为 Any。

我很难理解为什么价格/天选项卡可以与 sort() 一起使用,而价格/月选项卡却不行,而是它给了我LoadError

【问题讨论】:

    标签: julia julia-dataframe


    【解决方案1】:

    将列更改为适当的数据类型应该可以解决此问题(infer_eltypes):

    using DataFrames, XLSX
    
    df = DataFrame(XLSX.readtable("./dat.xlsx", "Sheet1", infer_eltypes=true)..., )
    #5×6 DataFrame
    # Row │ Date        Openprice  Highprice  Lowprice  Closeprice  Volume  
    #     │ Date        Any        Float64    Any       Float64     Int64   
    #─────┼─────────────────────────────────────────────────────────────────
    #   1 │ 2020-12-23  189.1          189.7  170.3          181.5  4170122
    #   2 │ 2020-11-30  160            191.6  158            189.1  8006506
    #   3 │ 2020-10-30  178.4          184.3  151.2          160.6  6760931
    #   4 │ 2020-09-30  138.5          178.8  137.9          177.5  9005351
    #   5 │ 2020-08-31  147.2          152.1  137.2          138.3  4865386
    

    现在,对日期进行排序可以正常工作:

    df[sortperm(df.Date),1:2]
    #5×2 DataFrame
    # Row │ Date        Openprice 
    #     │ Date        Any       
    #─────┼───────────────────────
    #   1 │ 2020-08-31  147.2
    #   2 │ 2020-09-30  138.5
    #   3 │ 2020-10-30  178.4
    #   4 │ 2020-11-30  160
    #   5 │ 2020-12-23  189.1
    

    也可以手动设置日期类型:

    using Dates
    
    df.Date = Dates.Date.(string.(df.Date), "yyyy-mm-dd")
    #5-element Array{Date,1}:
    # 2020-12-23
    # 2020-11-30
    # 2020-10-30
    # 2020-09-30
    # 2020-08-31
    

    【讨论】:

    • infer_eltypes=true 没有将我的日期列更改为数据类型日期。所以我需要手动更改类型,就像你在第二个例子中展示的那样,效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2016-06-04
    • 2017-06-16
    • 2021-06-25
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多