如何修改Pandas默认季度起止日期规则,自定义dt.quarter计算逻辑
解决方案
Pandas 内置的dt.quarter属性固定采用日历年标准季度规则(1、4、7、10月为季度起始),未提供全局配置入口直接修改判定逻辑,可通过自定义日期访问器的方式实现当前会话全局生效的自定义季度规则,完全匹配需求。
方案1:全局注册自定义访问器(当前会话永久生效)
只需要在会话开头运行一次注册代码,后续所有日期类型的Series、DataFrame列都可以直接调用自定义季度属性:
import pandas as pd import numpy as np # 注册自定义日期访问器 @pd.api.extensions.register_series_accessor("dt_custom") @pd.api.extensions.register_dataframe_accessor("dt_custom") class CustomQuarterAccessor: def __init__(self, obj): self._obj = obj # 自定义季度偏移月数:正数为延后,负数为提前,示例为延后1个月 self.quarter_offset = 1 @property def quarter(self): offset_month = self._obj.dt.month - self.quarter_offset # 处理跨年月度换算 adjusted_month = np.where(offset_month <= 0, offset_month + 12, offset_month) return (adjusted_month - 1) // 3 + 1
调用示例(完全匹配需求效果):
date_range = pd.date_range(start='2020-01-01', end='2021-01-01') df_dates = pd.DataFrame({'dates' : date_range}, index = date_range) print(df_dates['dates'].dt_custom.quarter.drop_duplicates())
输出结果:
2020-02-01 1 2020-05-01 2 2020-08-01 3 2020-11-01 4 Name: dates, dtype: int64
方案2:临时单行计算(无需注册)
如果不需要全局生效,可直接通过单行逻辑计算自定义季度:
# 示例为延后1个月的季度计算 offset = 1 df_dates['custom_quarter'] = ((df_dates['dates'].dt.month - offset - 1) % 12) // 3 + 1
扩展:自定义季度重采样
如果需要按自定义季度做聚合、重采样操作,可搭配QuarterBegin偏移类使用:
# 定义从2月开始的季度偏移规则 q_offset = pd.offsets.QuarterBegin(startingMonth=2) # 按自定义季度重采样统计示例 df_dates.resample(q_offset, on='dates').count()
内容的提问来源于stack exchange,提问作者Carl F. Corneil
相关产品推荐
相关产品推荐

