如何按指定最大间隔年数拆分起止日期为日期范围列表?
按指定最大年间隔拆分日期范围的实现方案
我明白你想要把两个日期之间的跨度,按照指定的最大年间隔拆分成连续的日期区间列表,用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
相关产品推荐
相关产品推荐

