【问题标题】:Can I groupby day or month in Julia using DataFrames我可以使用 DataFrames 在 Julia 中按天或按月分组吗
【发布时间】:2021-03-03 10:24:42
【问题描述】:

我正在使用 DataFrame,其中 column1 是 DateTime 类型,所有其他列都是 Float64 并代表每小时用水量。 DataFrame 跨越 2 年的用水量,每天每小时记录一次,看起来像这样。

Date                 | UserID1 | UserID2 | UserID3 | ...
DateTime             | Float64 | Float64 | Float64 | ...
---------------------------------------------------------
2017-01-01 00:00:00  | 1.5     | 22.5    | 5.5     | ...
2017-01-01 01:00:00  | 4.5     | 3.2     | 9.12    | ...
.
.
.
2019-12-31 22:00:00 |  4.2     |  7.6    | 8.9     | ...
2029-12-31 23:00:00 |  3.2     |  0.9    | 11.2    | ... 

我想为所有用户每月使用groupbysum 的用水量。 在熊猫中,我可以轻松地做类似的事情 df.groupby(df.index.month).sum()

我想不出 Julia DataFrames 的类比。 我使用 CSV、DataFrames 和 Dates 包。 我可以遍历 Date 列中的每个条目,例如

for i in df.Date
   if day(i) == 1
.
.
.

但我真的很想使用 groupby,因为它的 DataFrame 如此之大,而且除了 sum 之外,我还有其他几个我想执行的功能

【问题讨论】:

    标签: dataframe datetime julia


    【解决方案1】:

    考虑以下DataFrame

    julia> df = DataFrame(date=Date.(2020,rand(1:5,10), rand(1:28, 10)),val=rand(1:20,10))
    10×2 DataFrame
    │ Row │ date       │ val   │
    │     │ Date       │ Int64 │
    ├─────┼────────────┼───────┤
    │ 1   │ 2020-01-07 │ 17    │
    │ 2   │ 2020-04-17 │ 2     │
    │ 3   │ 2020-01-18 │ 18    │
    │ 4   │ 2020-01-01 │ 11    │
    │ 5   │ 2020-04-25 │ 16    │
    │ 6   │ 2020-05-08 │ 5     │
    │ 7   │ 2020-04-10 │ 4     │
    │ 8   │ 2020-02-12 │ 10    │
    │ 9   │ 2020-04-16 │ 1     │
    │ 10  │ 2020-03-16 │ 15    │
    

    这可以使用以下函数进行分组:

    julia> groupby(transform(df, :date => x->yearmonth.(x)),:date_function)
    GroupedDataFrame with 5 groups based on key: date_function
    First Group (3 rows): date_function = (2020, 1)
    │ Row │ date       │ val   │ date_function │
    │     │ Date       │ Int64 │ Tuple…        │
    ├─────┼────────────┼───────┼───────────────┤
    │ 1   │ 2020-01-07 │ 17    │ (2020, 1)     │
    │ 2   │ 2020-01-18 │ 18    │ (2020, 1)     │
    │ 3   │ 2020-01-01 │ 11    │ (2020, 1)     │
    ⋮
    Last Group (1 row): date_function = (2020, 3)
    │ Row │ date       │ val   │ date_function │
    │     │ Date       │ Int64 │ Tuple…        │
    ├─────┼────────────┼───────┼───────────────┤
    │ 1   │ 2020-03-16 │ 15    │ (2020, 3)     │
    

    using Query:

    julia> df |>
              @groupby(yearmonth(_.date)) |>
              @map({YearMonth=key(_), Sum=sum(_.val)}) |>
              DataFrame
    5×2 DataFrame
    │ Row │ YearMonth │ Sum   │
    │     │ Tuple…    │ Int64 │
    ├─────┼───────────┼───────┤
    │ 1   │ (2020, 1) │ 46    │
    │ 2   │ (2020, 4) │ 23    │
    │ 3   │ (2020, 5) │ 5     │
    │ 4   │ (2020, 2) │ 10    │
    │ 5   │ (2020, 3) │ 15    │
    

    【讨论】:

    • 等效但稍微好一点:groupby(transform(df, :date => ByRow(yearmonth)), :date_yearmonth)。如果你不改变列,你也可以将copycols=false 传递给transform 以获得性能。
    猜你喜欢
    • 2018-05-07
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2021-02-04
    • 2018-02-17
    • 1970-01-01
    相关资源
    最近更新 更多