Streamlit中无法使用px.timeline,Google Colab可正常运行
解决Plotly时间线图表在Streamlit部署时的JSON序列化错误
问题描述
部署后的Streamlit应用使用Plotly时间线图表时出现错误:
TypeError: Object of type timedelta is not JSON serializable
本地IDE中相同代码可正常运行,升级至streamlit-1.27.2后问题仍存在。
原因分析
本地开发环境与部署环境的依赖版本(尤其是Plotly、pandas)不一致,导致Plotly生成的图表对象中包含了timedelta类型数据,而Streamlit在将图表序列化为JSON时无法处理该类型。
解决方案
1. 显式转换日期列类型
在创建DataFrame后,将Start和Finish列显式转换为datetime类型,避免隐式生成timedelta数据:
import plotly.express as px import pandas as pd import streamlit as st df = pd.DataFrame([ dict(Task="Job A", Start='2009-01-01', Finish='2009-02-28'), dict(Task="Job B", Start='2009-03-05', Finish='2009-04-15'), dict(Task="Job C", Start='2009-02-20', Finish='2009-05-30') ]) # 显式转换为datetime类型 df['Start'] = pd.to_datetime(df['Start']) df['Finish'] = pd.to_datetime(df['Finish']) fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task") fig.update_yaxes(autorange="reversed") st.plotly_chart(fig)
2. 手动处理图表序列化
绕过Streamlit默认的序列化逻辑,手动将Plotly图表转为JSON后再加载:
import plotly.express as px import pandas as pd import streamlit as st import json from plotly.io import to_json df = pd.DataFrame([ dict(Task="Job A", Start='2009-01-01', Finish='2009-02-28'), dict(Task="Job B", Start='2009-03-05', Finish='2009-04-15'), dict(Task="Job C", Start='2009-02-20', Finish='2009-05-30') ]) fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task") fig.update_yaxes(autorange="reversed") # 手动序列化并加载图表 fig_json = to_json(fig) st.plotly_chart(json.loads(fig_json))
3. 对齐依赖版本
创建requirements.txt文件,指定与本地IDE完全一致的依赖版本,确保部署环境和开发环境的依赖匹配:
streamlit==1.27.2 plotly==5.17.0 # 替换为你本地的Plotly版本 pandas==2.1.4 # 替换为你本地的pandas版本
验证
修改代码或配置后重新部署应用,检查是否仍出现序列化错误。
内容的提问来源于stack exchange,提问作者Ad D
相关产品推荐
相关产品推荐

