如何用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)
关键说明
- 季度灵活性:若业务使用财年季度(如Q1从4月开始),只需修改
startingMonth参数为对应月份,同时调整freq参数(比如QS-APR)。 - 天数计算逻辑:通过
include_end参数控制是否包含结束日期,匹配不同业务场景需求。 - 批量处理:用
df.apply()替代逐行遍历,更符合Pandas的高效处理逻辑。
内容的提问来源于stack exchange,提问作者Binchentso
相关产品推荐
相关产品推荐

