You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:53:36