嵌套For循环批量获取多司机多日API数据失败求助
问题诊断与修复
核心问题分析
你的代码存在三个关键错误,导致数据不符合预期:
- DataFrame未累积:外层循环每次都重新初始化
df = pd.DataFrame(),且未将每日数据合并到总结果中,最终仅保留最后一天的20条数据。 - API请求顺序颠倒:先执行请求再构造URL,第一次循环时
url是未初始化的旧值,后续循环也会使用上一次循环最后生成的driver URL,导致请求参数错误。 - 循环范围不足:
range(0,6)仅遍历6天(索引0-5),若你需要7天数据,范围应覆盖所有calendar行。
修复后的代码
# 初始化总结果DataFrame,用来累积所有日期的司机数据 total_df = pd.DataFrame() # 遍历calendar中所有日期,用len(calendar)确保覆盖全部行 for i in range(len(calendar)): date = calendar['Date'][i].date() startMs = calendar['startMs'][i] endMs = calendar['endMs'][i] daily_df = pd.DataFrame() for driverId in drivers['id']: # 先构造当前driver+日期的请求URL url = f'https://api.samsara.com/v1/fleet/drivers/{driverId}/safety/score?startMs={startMs}&endMs={endMs}' # 再发送GET请求获取数据 response = requests.request('GET', url, headers=headers).json() daily_df = daily_df._append(response, ignore_index=True) time.sleep(1) # 给当日的司机数据添加日期标识 daily_df['Date'] = date # 将当日数据合并到总结果里 total_df = total_df._append(daily_df, ignore_index=True) # 最终的完整数据在total_df中 print(total_df.shape) # 正常情况下会输出(140, 列数)
关键修改说明
- 总数据容器初始化:在外层循环外创建
total_df,避免每次循环重置数据,确保所有日期的司机数据都能被累积。 - 修正请求顺序:先构造包含当前日期参数和driverId的URL,再发送请求,保证每次API调用的参数都是正确的。
- 动态适配循环范围:用
len(calendar)代替固定的range(0,6),不管calendar里有多少天数据都能完整遍历。 - 每日数据合并:将每日生成的
daily_df追加到总结果中,避免单天数据被覆盖。
内容的提问来源于stack exchange,提问作者Kendall
相关产品推荐
相关产品推荐

