Python遍历日期范围生成间隔起止日期并调用API获取完整数据
批量获取日期区间数据的解决方案
问题背景
现有接口URL支持通过start和end参数(格式为YYYY-MM-DD)返回JSON数据,单次最多获取28天的数据。需获取2021-05-01至2021-10-24的完整数据,当前已实现起始日期遍历,但存在两个问题:
- 如何将生成的起止日期传入URL参数
- 如何保证最后一段的结束日期为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
相关产品推荐
相关产品推荐

