Flask API运行报错:TypeError: datetime.date无法适配int对象
解决Flask降水API的TypeError报错
报错根源
报错指向代码第57行,核心是两处拼写错误直接触发类型错误:
datetime.ddatetime.strptime多写了一个d,正确写法为datetime.datetime.strptimedatetime.timedelata拼写错误,正确为datetime.timedelta
此外还有一处潜在问题:数据库中Measurement.date是字符串格式,直接用Python date对象比较可能出现类型不匹配,建议用SQLAlchemy的func.strftime统一格式后再过滤。
修复后的完整precipitation路由代码
@app.route("/api/v1.0/precipitation") def precipitation(): session = Session(engine) last_date = session.query(func.max(Measurement.date)).scalar() # 修正拼写错误:ddatetime -> datetime last_date_obj = datetime.datetime.strptime(last_date, '%Y-%m-%d').date() # 修正拼写错误:timedelata -> timedelta one_year_ago = last_date_obj - datetime.timedelta(days=365) # 转换为字符串格式,避免类型不匹配 one_year_ago_str = one_year_ago.strftime('%Y-%m-%d') # 用func.strftime统一日期格式后过滤 precipitation_data = session.query(Measurement.date, Measurement.prcp)\ .filter(func.strftime('%Y-%m-%d', Measurement.date) >= one_year_ago_str)\ .all() session.close() precipitation_dict = {date: prcp for date, prcp in precipitation_data} return jsonify(precipitation_dict)
额外优化建议
- 处理
prcp为None的情况,避免JSON序列化问题:precipitation_dict = {date: prcp if prcp is not None else 0 for date, prcp in precipitation_data} - 参考Jupyter Notebook逻辑,对每日降水取最大值,避免同一日期多条数据:
precipitation_data = session.query(Measurement.date, func.max(Measurement.prcp))\ .filter(func.strftime('%Y-%m-%d', Measurement.date) >= one_year_ago_str)\ .group_by(Measurement.date)\ .all()
内容的提问来源于stack exchange,提问作者Fowler
相关产品推荐
相关产品推荐

