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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:08:54