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

如何按指定最大间隔年数拆分起止日期为日期范围列表?

按指定最大年间隔拆分日期范围的实现方案

我明白你想要把两个日期之间的跨度,按照指定的最大年间隔拆分成连续的日期区间列表,用pandas.interval_range没成功没关系,咱们用两种思路来实现这个需求——纯Python datetime模块,或者更贴合你需求的pandas方案。

方法一:纯Python datetime实现

这个方法不需要依赖第三方库,用datetime和dateutil.relativedelta(处理年份偏移更准确,避免闰年等问题)来实现:

from datetime import datetime
from dateutil.relativedelta import relativedelta

def split_date_range(start_date_str, end_date_str, max_years):
    start = datetime.strptime(start_date_str, '%Y-%m-%d').date()
    end = datetime.strptime(end_date_str, '%Y-%m-%d').date()
    date_ranges = []
    
    current_start = start
    while True:
        # 计算当前区间的结束日期:当前起始 + max_years年
        current_end = current_start + relativedelta(years=max_years)
        # 如果当前结束超过最终日期,就用最终日期作为结束
        if current_end > end:
            current_end = end
        date_ranges.append([current_start.strftime('%Y-%m-%d'), current_end.strftime('%Y-%m-%d')])
        # 如果已经到了最终日期,退出循环
        if current_end == end:
            break
        # 更新下一个区间的起始为当前区间的结束
        current_start = current_end
    
    return date_ranges

# 测试示例
print(split_date_range('1990-01-01', '2020-02-18', 25))
# 输出:[['1990-01-01', '2015-01-01'], ['2015-01-01', '2020-02-18']]

print(split_date_range('1990-01-01', '2020-02-18', 5))
# 输出:[['1990-01-01', '1995-01-01'], ['1995-01-01', '2000-01-01'], ['2000-01-01', '2005-01-01'], ['2005-01-01', '2010-01-01'], ['2010-01-01', '2015-01-01'], ['2015-01-01', '2020-01-01'], ['2020-01-01', '2020-02-18']]

方法二:Pandas实现

如果你更倾向用pandas,可以通过生成分割点的日期序列,再将相邻日期配对成区间:

import pandas as pd

def split_date_range_pandas(start_date_str, end_date_str, max_years):
    start = pd.to_datetime(start_date_str)
    end = pd.to_datetime(end_date_str)
    
    # 生成所有分割点:从start开始,每隔max_years的1月1日,直到超过end
    offsets = pd.date_range(start=start, end=end, freq=f'{max_years}AS-JAN')
    # 如果最后一个分割点早于end,把end加进去
    if offsets[-1] < end:
        offsets = offsets.append(pd.DatetimeIndex([end]))
    # 把相邻的日期配对成区间,转成字符串格式
    date_ranges = [[offsets[i].strftime('%Y-%m-%d'), offsets[i+1].strftime('%Y-%m-%d')] for i in range(len(offsets)-1)]
    
    return date_ranges

# 测试示例
print(split_date_range_pandas('1990-01-01', '2020-02-18', 25))
# 输出:[['1990-01-01', '2015-01-01'], ['2015-01-01', '2020-02-18']]

print(split_date_range_pandas('1990-01-01', '2020-02-18', 5))
# 输出:[['1990-01-01', '1995-01-01'], ['1995-01-01', '2000-01-01'], ['2000-01-01', '2005-01-01'], ['2005-01-01', '2010-01-01'], ['2010-01-01', '2015-01-01'], ['2015-01-01', '2020-01-01'], ['2020-01-01', '2020-02-18']]

关键点说明

  • 用relativedelta或pd.DateOffset处理年份偏移,比直接用timedelta更准确,因为它会自动处理闰年、月份天数不一致等问题。
  • 两种方法都会自动处理最后一个区间的结束日期,确保刚好覆盖到你指定的最终日期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:02:30