如何计算一年中每个月每个 ID 的日期数?

问题描述

任务:

计算2021年每个月每个ID出现的频率

  • 频率公式:每个 ID 每月内的日期计数(例如 ID:44;月份:01-2021;频率:3)

示例:

times = [
    '2021-02-18','2021-03-02','2021-04-23','2021-01-18','2021-01-19','2021-01-20','2021-01-03','2021-02-04','2021-02-04'
] 

id = [1,1,44,46,46]

df = pd.DataFrame({'ID':id,'Date': pd.to_datetime(times)})

df = df.reset_index(drop=True)

print(df)

   ID       Date
0   1 2021-02-18
1   1 2021-03-02
2   1 2021-03-02
3   1 2021-04-23
4  44 2021-01-18
5  44 2021-01-19
6  44 2021-01-20
7  46 2021-01-03
8  46 2021-02-04
9  46 2021-02-04

期望的输出

   id  01_2021  02_2021  03_2021  04_2021
0   1        0        1        2        1
1  44        3        0        0        0
2  46        1        2        0        0

解决方法

使用 crosstab 将日期时间转换为格式为 models 的字符串:

MM-YYYY

月份周期解决方案类似,使用Series.dt.to_period

df = pd.crosstab(df['ID'],df['Date'].dt.strftime('%m_%Y')).reset_index().rename_axis(None,axis=1)
print(df)
   ID  01_2021  02_2021  03_2021  04_2021
0   1        0        1        2        1
1  44        3        0        0        0
2  46        1        2        0        0

编辑:在 df = pd.crosstab(df['ID'],df['Date'].dt.to_period('m')).reset_index().rename_axis(None,axis=1) print(df) ID 2021-01 2021-02 2021-03 2021-04 0 1 0 1 2 1 1 44 3 0 0 0 2 46 1 2 0 0 中使用了半个月的 SMS Dateoffset

resample