# Counting Value Occurences in Time Range in DataFrames

**URL:** <https://discourse.julialang.org/t/counting-value-occurences-in-time-range-in-dataframes/60097>\
**Category:** Data\
**Tags:** dataframes\
**Created:** [April 27, 2021, 10:54am UTC](https://discourse.julialang.org/t/counting-value-occurences-in-time-range-in-dataframes/60097 "2021-04-27T10:54:47Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![TBulka](https://avatars.discourse-cdn.com/v4/letter/t/b5a626/32.png) [@TBulka](https://discourse.julialang.org/u/TBulka)\
**Post date:** [April 27, 2021, 10:54am UTC](https://discourse.julialang.org/t/counting-value-occurences-in-time-range-in-dataframes/60097/1 "2021-04-27T10:54:47Z")

</div>

Hello everyone,

say, I construct a data frame like this:

```julia
using Dates
using DataFrames

datevec = collect(Date(2020, 02, 22):Day(1):Date(2020, 03, 03))
valuevec = ["A", "B", "A", "A", "C", "C", "A", "C", "A", "A", "B"]
df = DataFrame(d=datevec, v=valuevec)

```

What I would like to do now is to count how often “A”, “B” and “C” occur each month. Is there any elegant way to do this?

Please ask, if you need additional information.

Thanks very much for your help in advance!

Thomas

---

<div class="post-metadata">

**Author:** ![sijo](https://avatars.discourse-cdn.com/v4/letter/s/da6949/32.png) [@sijo](https://discourse.julialang.org/u/sijo)\
**Post date:** [April 27, 2021, 11:33am UTC](https://discourse.julialang.org/t/counting-value-occurences-in-time-range-in-dataframes/60097/2 "2021-04-27T11:33:17Z")

</div>

Here’s a solution:

```julia
# Add a column for the month
df.m = month.(df.d)

combine(groupby(df, [:m, :v]), nrow)

```

or without changing the original dataframe:

```julia
df2 = transform(df, :d => ByRow(month) => :m)

combine(groupby(df2, [:m, :v]), nrow)

```

Result:

```julia
5×3 DataFrame
 Row │ m v nrow  
     │ Int64 String Int64 
─────┼──────────────────────
   1 │ 2 A 4
   2 │ 2 B 1
   3 │ 2 C 3
   4 │ 3 A 2
   5 │ 3 B 1

```

---

<div class="post-metadata">

**Author:** ![Skoffer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/skoffer/32/378_2.png) [@Skoffer](https://discourse.julialang.org/u/Skoffer)\
**Post date:** [April 27, 2021, 12:31pm UTC](https://discourse.julialang.org/t/counting-value-occurences-in-time-range-in-dataframes/60097/3 "2021-04-27T12:31:23Z")

</div>

If you want to preserve dates, you can use `trunc` instead of `month`

```julia
julia> df2 = transform(df, :d => (x -> trunc.(x, Dates.Month)) => :m);

julia> combine(groupby(df2, [:m, :v]), nrow)
5×3 DataFrame
 Row │ m v nrow
     │ Date String Int64
─────┼───────────────────────────
   1 │ 2020-02-01 A 4
   2 │ 2020-02-01 B 1
   3 │ 2020-02-01 C 3
   4 │ 2020-03-01 A 2
   5 │ 2020-03-01 B 1

```

---

<div class="post-metadata">

**Author:** ![TBulka](https://avatars.discourse-cdn.com/v4/letter/t/b5a626/32.png) [@TBulka](https://discourse.julialang.org/u/TBulka)\
**Post date:** [April 28, 2021, 10:47am UTC](https://discourse.julialang.org/t/counting-value-occurences-in-time-range-in-dataframes/60097/4 "2021-04-28T10:47:08Z")

</div>

Hello everyone and thanks for your advice. It now works as intented!
