【问题标题】:Julia @Subset Dates朱莉娅@Subset 日期
【发布时间】:2021-11-04 01:46:15
【问题描述】:

这应该很简单,但我找不到任何文档或之前的问答。使用 Julia 进行子集化很容易,尤其是使用 @Chain 命令。但我这辈子还没有想出一种方法来对日期进行子集化:

maindf = @chain rawdf begin
    @subset(Dates.year(:travel_date) .== 2019)
end

在所有文档中 Dates.year(today()) 应该产生 (2021) 但这最终给我一个错误:

ERROR: MethodError: no method matching +(::Vector{Date}, ::Int64)
Closest candidates are:
  +(::Any, ::Any, ::Any, ::Any...) at operators.jl:560
  +(::T, ::T) where T<:Union{Int128, Int16, Int32, Int64, Int8, UInt128, UInt16, UInt32, UInt64, UInt8} at int.jl:87
  +(::T, ::Integer) where T<:AbstractChar at char.jl:223

不确定我收到方法错误的确切原因..

在使用 DPLYR 的 R 中,这只是:

maindf = rawdf %>% 
filter(., year(travel_date) == 2019)

有什么想法吗?

【问题讨论】:

    标签: date filter julia subset


    【解决方案1】:

    用途:

    julia> using DataFramesMeta, Dates
    
    julia> df = DataFrame(travel_date=repeat([Date(2019,1,1), Date(2020,1,1)],3), id=1:6)
    6×2 DataFrame
     Row │ travel_date  id
         │ Date         Int64
    ─────┼────────────────────
       1 │ 2019-01-01       1
       2 │ 2020-01-01       2
       3 │ 2019-01-01       3
       4 │ 2020-01-01       4
       5 │ 2019-01-01       5
       6 │ 2020-01-01       6
    
    julia> @rsubset(df, year(:travel_date) == 2019)
    3×2 DataFrame
     Row │ travel_date  id
         │ Date         Int64
    ─────┼────────────────────
       1 │ 2019-01-01       1
       2 │ 2019-01-01       3
       3 │ 2019-01-01       5
    
    julia> @subset(df, year.(:travel_date) .== 2019)
    3×2 DataFrame
     Row │ travel_date  id
         │ Date         Int64
    ─────┼────────────────────
       1 │ 2019-01-01       1
       2 │ 2019-01-01       3
       3 │ 2019-01-01       5
    

    区别在于@rsubset 按行工作,@subset 按整列工作。

    您的问题是,在 Dates.year(:travel_date) .== 2019) 中,您混合了 year 函数的非广播调用和广播比较 .== 2019。您始终需要确保按行(在本例中使用 @rsubset)或在整列(使用 @subset)上工作。

    不同的场景可能需要不同的方法。以下是整列方法有用的示例:

    julia> using Statistics
    
    julia> @subset(df, :id .> mean(:id))
    3×2 DataFrame
     Row │ travel_date  id
         │ Date         Int64
    ─────┼────────────────────
       1 │ 2020-01-01       4
       2 │ 2019-01-01       5
       3 │ 2020-01-01       6
    

    您希望mean 对整列进行操作的位置。

    编辑

    这里和@chain一样:

    julia> @chain df begin
               @subset year.(:travel_date) .== 2019
           end
    3×2 DataFrame
     Row │ travel_date  id
         │ Date         Int64
    ─────┼────────────────────
       1 │ 2019-01-01       1
       2 │ 2019-01-01       3
       3 │ 2019-01-01       5
    

    【讨论】:

    • 嗯,这很有趣,当我运行你的代码时,它直到我把它从我的链中断开后才起作用: maindf = @chain rawdf begin @subset(rawdf, year.(:travel_date) 。 == 2019) end ERROR: LoadError: MethodError: no method matching fun_to_vec(::Symbol; no_dest=true, outer_flags=(@byrow = Base.RefValue{Bool}(false),)) 但是@subset(rawdf, year. (:travel_date) .== 2019) 作品...
    • 我在编辑中添加了@chain示例
    猜你喜欢
    • 2018-11-27
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2014-12-31
    • 2017-01-15
    • 2016-02-18
    • 1970-01-01
    相关资源
    最近更新 更多