朱莉娅@子集日期

Bil*_*002 3 date subset filter julia

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

maindf = @chain rawdf begin
    @subset(Dates.year(:travel_date) .== 2019)
end
Run Code Online (Sandbox Code Playgroud)

在所有文档中 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
Run Code Online (Sandbox Code Playgroud)

不确定为什么我会收到方法错误..

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

maindf = rawdf %>% 
filter(., year(travel_date) == 2019)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Bog*_*ski 5

使用:

\n
julia> using DataFramesMeta, Dates\n\njulia> df = DataFrame(travel_date=repeat([Date(2019,1,1), Date(2020,1,1)],3), id=1:6)\n6\xc3\x972 DataFrame\n Row \xe2\x94\x82 travel_date  id\n     \xe2\x94\x82 Date         Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 2019-01-01       1\n   2 \xe2\x94\x82 2020-01-01       2\n   3 \xe2\x94\x82 2019-01-01       3\n   4 \xe2\x94\x82 2020-01-01       4\n   5 \xe2\x94\x82 2019-01-01       5\n   6 \xe2\x94\x82 2020-01-01       6\n\njulia> @rsubset(df, year(:travel_date) == 2019)\n3\xc3\x972 DataFrame\n Row \xe2\x94\x82 travel_date  id\n     \xe2\x94\x82 Date         Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 2019-01-01       1\n   2 \xe2\x94\x82 2019-01-01       3\n   3 \xe2\x94\x82 2019-01-01       5\n\njulia> @subset(df, year.(:travel_date) .== 2019)\n3\xc3\x972 DataFrame\n Row \xe2\x94\x82 travel_date  id\n     \xe2\x94\x82 Date         Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 2019-01-01       1\n   2 \xe2\x94\x82 2019-01-01       3\n   3 \xe2\x94\x82 2019-01-01       5\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

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

\n
julia> using Statistics\n\njulia> @subset(df, :id .> mean(:id))\n3\xc3\x972 DataFrame\n Row \xe2\x94\x82 travel_date  id\n     \xe2\x94\x82 Date         Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 2020-01-01       4\n   2 \xe2\x94\x82 2019-01-01       5\n   3 \xe2\x94\x82 2020-01-01       6\n
Run Code Online (Sandbox Code Playgroud)\n

您想要mean对整列进行操作的位置。

\n

编辑

\n

这里与 相同@chain

\n
julia> @chain df begin\n           @subset year.(:travel_date) .== 2019\n       end\n3\xc3\x972 DataFrame\n Row \xe2\x94\x82 travel_date  id\n     \xe2\x94\x82 Date         Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 2019-01-01       1\n   2 \xe2\x94\x82 2019-01-01       3\n   3 \xe2\x94\x82 2019-01-01       5\n
Run Code Online (Sandbox Code Playgroud)\n