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

如何用Python/Pandas计算两个日期区间内各季度的天数

解决方案:用Pandas计算跨季度/年度的日期区间季度天数

核心思路

不用复杂的if-else嵌套,而是通过生成所有涉及的季度边界,逐个计算每个季度与目标日期区间的重叠天数,逻辑通用且适配任意跨季度/年度场景。

实现代码

import pandas as pd
import datetime as dt

def calculate_quarter_days(start, end, include_end=False):
    # 确保起始日期不晚于结束日期
    if start > end:
        start, end = end, start
    
    # 生成所有涉及的季度起始日期(以自然年季度为例:Q1=1-3月)
    # 若需财年季度,修改startingMonth参数即可,比如财年Q1从4月开始则设为4
    first_quarter_start = start - pd.offsets.QuarterBegin(startingMonth=1)
    last_quarter_start = end + pd.offsets.QuarterBegin(startingMonth=1)
    quarter_starts = pd.date_range(start=first_quarter_start, end=last_quarter_start, freq='QS-JAN').unique()
    
    quarter_day_dict = {}
    for q_start in quarter_starts:
        # 获取当前季度的结束日期
        q_end = q_start + pd.offsets.QuarterEnd(startingMonth=1)
        # 计算当前季度与目标区间的实际重叠范围
        actual_start = max(q_start, start)
        actual_end = min(q_end, end)
        
        # 无重叠则跳过
        if actual_start > actual_end:
            continue
        
        # 计算天数:include_end=True则包含结束当天,否则只算间隔天数
        if include_end:
            days = (actual_end - actual_start).days + 1
        else:
            days = (actual_end - actual_start).days
        
        # 生成季度标签(如2024Q1)
        quarter_label = q_start.strftime('%YQ%q')
        quarter_day_dict[quarter_label] = days
    
    return quarter_day_dict

# 测试用户示例
start = pd.Timestamp(dt.date(2024,1,1))
end = pd.Timestamp(dt.date(2024,6,30))
print(calculate_quarter_days(start, end))  # 输出: {'2024Q1': 90, '2024Q2': 90}

# 处理DataFrame批量数据
df = pd.DataFrame({
    'start': [pd.Timestamp('2023-11-15'), pd.Timestamp('2024-05-20')],
    'end': [pd.Timestamp('2024-02-20'), pd.Timestamp('2025-01-10')]
})

# 给每行添加季度天数计算结果
df['quarter_days'] = df.apply(lambda row: calculate_quarter_days(row['start'], row['end']), axis=1)
print(df)

关键说明

  1. 季度灵活性:若业务使用财年季度(如Q1从4月开始),只需修改startingMonth参数为对应月份,同时调整freq参数(比如QS-APR)。
  2. 天数计算逻辑:通过include_end参数控制是否包含结束日期,匹配不同业务场景需求。
  3. 批量处理:用df.apply()替代逐行遍历,更符合Pandas的高效处理逻辑。

内容的提问来源于stack exchange,提问作者Binchentso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:38:30