如何在Pandas中自定义月度周期起止日期并统计值出现次数?
自定义月度周期统计status为'yes'的次数
现有场景
你已经有一个包含date和status字段的Pandas DataFrame,当前代码按自然月度(%Y-%m)统计每个周期内status为'yes'的次数。现在需要将统计周期改为每月10日至次月9日,可以通过以下两种方法实现:
方法一:日期偏移法(简单直观)
通过给日期减去9天,让每月10日及之后的日期归到当前自然月标签,9日及之前的日期归到上月标签,以此匹配自定义周期:
import pandas as pd # 保留你原有的DataFrame初始化代码 # df = pd.DataFrame(data=data) # df.date = pd.to_datetime(df.date) # 生成自定义周期标签 df['period'] = (df['date'] - pd.Timedelta(days=9)).dt.strftime('%Y-%m') # 统计每个周期内status为'yes'的次数 total_yes_period = df[df['status'] == 'yes'].groupby('period').size().sort_index()
原理说明:
- 例如
2022-02-09减去9天是2022-01-31,对应周期标签2022-01,代表该日期属于2022-01-10 ~ 2022-02-09这个周期 2022-02-10减去9天是2022-02-01,对应周期标签2022-02,代表该日期属于2022-02-10 ~ 2022-03-09这个周期
方法二:自定义频率分组(更规范)
使用Pandas的pd.Grouper结合MonthBegin偏移量,直接定义每月10日为周期起始点:
import pandas as pd # 保留你原有的DataFrame初始化代码 # 定义自定义月度频率:每月10日作为周期起始 custom_month = pd.offsets.MonthBegin(1, day=10) # 将日期归到所属周期的起始日,再转为周期标签 df['period'] = df['date'].dt.floor(custom_month).dt.strftime('%Y-%m') # 统计次数 total_yes_period = df[df['status'] == 'yes'].groupby('period').size().sort_index()
原理说明:
dt.floor(custom_month)会把每个日期向下对齐到最近的周期起始日(每月10日)- 例如
2022-02-08对齐到2022-01-10,标签为2022-01;2022-02-10对齐到2022-02-10,标签为2022-02,完美匹配自定义周期范围
验证结果
两种方法得到的total_yes_period结果一致,会按自定义周期输出每个区间内'yes'的统计次数,且按周期顺序排序。
内容的提问来源于stack exchange,提问作者Cace
相关产品推荐
相关产品推荐

