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内部以毫秒为单位处理时间戳),具体操作如下:
- 计算起始与结束时间的时间差,通过
timedelta.total_seconds()转换为总秒数,再乘以1000得到毫秒数,最后除以你需要的bin数量得到单个bin的毫秒大小。 - 将计算出的毫秒数值赋值给
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
相关产品推荐
相关产品推荐

