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

Python遍历日期范围生成间隔起止日期并调用API获取完整数据

批量获取日期区间数据的解决方案

问题背景

现有接口URL支持通过start和end参数(格式为YYYY-MM-DD)返回JSON数据,单次最多获取28天的数据。需获取2021-05-01至2021-10-24的完整数据,当前已实现起始日期遍历,但存在两个问题:

  1. 如何将生成的起止日期传入URL参数
  2. 如何保证最后一段的结束日期为2021-10-24而非自动生成的后续日期

解决方案

1. 修正日期遍历逻辑,覆盖完整区间

修改原有循环逻辑,每次计算当前批次的结束日期:取「当前起始日期+27天」和「目标结束日期」的较小值,确保最后一批次不会超出目标区间,同时保证每批数据最多28天。

示例代码:

from datetime import date, timedelta

# 目标时间范围
target_start = date(2021, 5, 1)
target_end = date(2021, 10, 24)
# 单次最大间隔(28天周期,所以间隔27天)
max_interval = timedelta(days=27)

current_start = target_start
while current_start <= target_end:
    # 计算当前批次的结束日期:不超过目标结束日期
    current_end = min(current_start + max_interval, target_end)
    print(f"批次区间: {current_start.strftime('%Y-%m-%d')} 至 {current_end.strftime('%Y-%m-%d')}")
    # 更新下一批次的起始日期
    current_start = current_end + timedelta(days=1)

运行后输出的批次区间会完整覆盖目标范围:

批次区间: 2021-05-01 至 2021-05-28
批次区间: 2021-05-29 至 2021-06-25
批次区间: 2021-06-26 至 2021-07-23
批次区间: 2021-07-24 至 2021-08-20
批次区间: 2021-08-21 至 2021-09-17
批次区间: 2021-09-18 至 2021-10-15
批次区间: 2021-10-16 至 2021-10-24

2. 生成带参数的URL并收集数据

可以用f-string直接拼接参数(简单场景),或用urllib.parse.urlencode构造参数(多参数场景更规范),结合requests库请求接口并收集返回的JSON数据。

示例完整代码:

from datetime import date, timedelta
import requests

# 接口基础URL
base_url = "https://thisisaurl.com/data/asd007"
target_start = date(2021, 5, 1)
target_end = date(2021, 10, 24)
max_interval = timedelta(days=27)

# 存储所有请求到的数据
all_data = []

current_start = target_start
while current_start <= target_end:
    current_end = min(current_start + max_interval, target_end)
    # 格式化为接口要求的字符串格式
    start_str = current_start.strftime("%Y-%m-%d")
    end_str = current_end.strftime("%Y-%m-%d")
    
    # 方式1:直接拼接URL
    request_url = f"{base_url}?start={start_str}&end={end_str}"
    
    # 方式2:用urlencode构造参数(更适合多参数场景)
    # from urllib.parse import urlencode
    # params = {"start": start_str, "end": end_str}
    # request_url = f"{base_url}?{urlencode(params)}"
    
    # 请求接口并收集数据
    response = requests.get(request_url)
    if response.status_code == 200:
        all_data.extend(response.json())
    else:
        print(f"请求失败: {request_url},状态码: {response.status_code}")
    
    # 更新下一批次起始日期
    current_start = current_end + timedelta(days=1)

# 后续可对all_data进行处理
print(f"共获取到 {len(all_data)} 条数据")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:35:30