You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:35:14