问题描述
任务:
计算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