Dash DatePickerRange绑定Graph报TypeError无效类型比对错误如何解决
问题修复方案
你遇到的类型比对报错由4处代码问题共同导致,按以下步骤修改即可解决:
1. 修正DataFrame日期列转换逻辑
你写的循环会将整列Date覆盖为最后一行的日期值,完全不符合转换预期,使用pandas内置方法批量转换即可:
import pandas as pd # 统一将Date列转为datetime类型,可省略format参数让pandas自动识别格式 dfEconomic['Date'] = pd.to_datetime(dfEconomic['Date'], format="%Y-%m-%d")
2. 修正回调参数顺序与触发逻辑
Dash回调的传参规则为:所有Input参数按定义顺序在前,所有State参数按定义顺序在后,你当前的参数顺序完全错位,同时可根据你的需求选择更新触发逻辑:
方案A:点击提交按钮才更新图表(符合你加提交按钮的设计初衷)
@app.callback( Output('graph_2', 'figure'), Input('submit_button', 'n_clicks'), # 日期选择器设为State,只有点击按钮才会读取值 [State('date-picker', 'start_date'), State('date-picker', 'end_date')], prevent_initial_call=True ) def update_graph_2(n_clicks, start_date, end_date): # 将日期选择器返回的字符串转为datetime,和DataFrame列类型统一 start_dt = datetime.strptime(start_date, "%Y-%m-%d") end_dt = datetime.strptime(end_date, "%Y-%m-%d") # 先过滤出符合区间的数据集 filter_df = dfEconomic[(dfEconomic['Date'] >= start_dt) & (dfEconomic['Date'] <= end_dt)] fig = { 'data': [{ 'x': filter_df['Date'], 'y': filter_df["Amount [DKK]"], 'type': 'bar' }] } return fig
方案B:选择日期后自动更新图表(不需要点击提交)
直接移除提交按钮相关的State配置即可:
@app.callback( Output('graph_2', 'figure'), [Input('date-picker', 'start_date'), Input('date-picker', 'end_date')] ) def update_graph_2(start_date, end_date): start_dt = datetime.strptime(start_date, "%Y-%m-%d") end_dt = datetime.strptime(end_date, "%Y-%m-%d") filter_df = dfEconomic[(dfEconomic['Date'] >= start_dt) & (dfEconomic['Date'] <= end_dt)] fig = { 'data': [{ 'x': filter_df['Date'], 'y': filter_df["Amount [DKK]"], 'type': 'bar' }] } return fig
3. 额外注意
你原代码中给x赋值的是过滤后的整行DataFrame,实际应该取过滤后的Date列,且y值也要对应过滤后的数据集,否则会出现x、y长度不匹配的问题。
内容的提问来源于stack exchange,提问作者Søren T
相关产品推荐
相关产品推荐

