如何在Pandas中将日期范围拆分为含起止日期的子区间?
用Pandas拆分日期范围为包含起止的子区间
嘿,这个需求我之前做项目的时候刚好碰到过,给你分享一个简洁的实现方法!
核心思路
我们可以先通过pd.date_range生成按指定频率分隔的日期节点,然后将相邻节点配对形成子区间;最后处理边界情况——确保最后一个子区间的结束日期是你指定的总结束日期,哪怕它不足一个完整的频率周期。
实现代码
import pandas as pd def split_date_range(start_date, end_date, freq): # 生成按频率分隔的日期节点,包含起始日期 dates = pd.date_range(start=start_date, end=end_date, freq=freq) # 检查最后一个节点是否等于总结束日期,若不等则补充 if dates[-1] != pd.to_datetime(end_date): dates = dates.append(pd.DatetimeIndex([end_date])) # 配对相邻日期,生成子区间的起止对 date_pairs = [(dates[i], dates[i+1]) for i in range(len(dates)-1)] # 转换为你需要的字符串格式(如'%Y%m%d'),不需要的话可直接返回datetime对象 return [(start.strftime('%Y%m%d'), end.strftime('%Y%m%d')) for start, end in date_pairs]
测试你的示例
运行以下代码测试你给出的例子:
# 测试输入 result = split_date_range(start='20180301', end='20180311', freq='3D') # 打印结果 for idx, (start, end) in enumerate(result): print(f"[{idx}] {start}, {end}")
输出结果完全符合你的要求:
[0] 20180301, 20180303
[1] 20180304, 20180306
[2] 20180307, 20180309
[3] 20180310, 20180311
小提示
如果你不需要字符串格式的日期,想要保留datetime对象,直接修改函数的返回语句即可:
return [(dates[i], dates[i+1]) for i in range(len(dates)-1)]
内容的提问来源于stack exchange,提问作者Johan de Groot
相关产品推荐
相关产品推荐

