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

Plotly直方图datetime类型xbins参数设置报错,求正确配置方法

Plotly直方图datetime类型bins配置报错解决

问题描述

我需要为Plotly直方图定义bin的大小、起始和结束时间,编写的代码如下:

go.Histogram(x=data, histnorm='',autobinx=False,
        xbins=dict(start=datetime.datetime(1900, 1, 1, 6, 30),
                   end=datetime.datetime(1900, 1, 1, 9, 30),
                   size=(datetime.datetime(1900, 1, 1, 9, 30)-datetime.datetime(1900, 1, 1, 6, 30))/30)

运行时报错:

TypeError: Object of type timedelta is not JSON serializable

请问如何正确以datetime方式配置直方图的bins参数?

解决方法

Plotly的xbins.size不支持直接传入timedelta对象,因为它无法被JSON序列化。需要将时间差转换为毫秒数(Plotly内部以毫秒为单位处理时间戳),具体操作如下:

  1. 计算起始与结束时间的时间差,通过timedelta.total_seconds()转换为总秒数,再乘以1000得到毫秒数,最后除以你需要的bin数量得到单个bin的毫秒大小。
  2. 将计算出的毫秒数值赋值给xbins.size,start和end可以直接保留datetime对象,Plotly会自动处理为对应的时间戳。

修改后的完整代码示例:

import datetime
import plotly.graph_objects as go

# 定义时间范围
start_time = datetime.datetime(1900, 1, 1, 6, 30)
end_time = datetime.datetime(1900, 1, 1, 9, 30)
# 计算单个bin的毫秒大小:总时长分成30个bin
bin_size_ms = (end_time - start_time).total_seconds() * 1000 / 30

# 创建直方图
fig = go.Figure(data=[go.Histogram(
    x=data,
    histnorm='',
    autobinx=False,
    xbins=dict(
        start=start_time,
        end=end_time,
        size=bin_size_ms
    )
)])

fig.show()

如果需要固定时长的bin(例如每5分钟一个bin),可以直接计算固定毫秒数,写法更直观:

# 5分钟对应的毫秒数:5*60秒*1000毫秒/秒
bin_size_ms = 5 * 60 * 1000

内容的提问来源于stack exchange,提问作者GDI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:57:15