首页 > 解决方案 > 朱莉娅@Subset 日期

问题描述

这应该很容易,但我找不到任何文档或之前的问答。使用 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)

有任何想法吗?

标签: datefilterjuliasubset

解决方案


采用:

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

推荐阅读