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

Seaborn绘制赛事时间distplot遇datetime.time类型报错的解决求助

解决Seaborn绘制datetime.time类型数据的分布直方图错误

嘿,这个问题我之前也踩过坑!Seaborn的distplot(现在官方更推荐用displot啦)没法直接处理datetime.time类型的数据——因为这类时间对象不支持算术运算(比如你报错里的+操作),而分布绘图函数需要数值型数据来计算统计量(比如均值、区间划分这些)。

下面是具体的解决步骤:

1. 把datetime.time转换成数值型(比如总秒数)

我们需要把时间转换成连续的数值,最常用的就是转换成总秒数(或者分钟数、小时数,根据你的数据粒度调整)。可以写个简单的转换函数:

def time_to_seconds(time_obj):
    # 计算时间对应的总秒数:小时*3600 + 分钟*60 + 秒
    return time_obj.hour * 3600 + time_obj.minute * 60 + time_obj.second

如果你的数据存在列表里,直接批量转换:

import datetime

# 假设这是你的原始时间数据
raw_times = [datetime.time(0,27,53), datetime.time(0,27,53), datetime.time(0,27,54), ...]
# 转换成总秒数
time_seconds = [time_to_seconds(t) for t in raw_times]

如果用Pandas处理数据会更方便:

import pandas as pd

df = pd.DataFrame({'race_time': raw_times})
df['total_seconds'] = df['race_time'].apply(lambda x: x.hour*3600 + x.minute*60 + x.second)

2. 用转换后的数值绘制分布图

现在有了数值型数据,就可以正常用Seaborn绘图了。这里推荐用displot(替代旧版的distplot):

import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter

# 绘制分布直方图+核密度估计
sns.displot(data=df, x='total_seconds', kde=True, bins=10)

# 把x轴的秒数转回时间格式,让图表更直观
def format_seconds_to_time(x, pos):
    hours = int(x // 3600)
    minutes = int((x % 3600) // 60)
    seconds = int(x % 60)
    return f"{hours:02d}:{minutes:02d}:{seconds:02d}"

# 应用自定义格式到x轴
plt.gca().xaxis.set_major_formatter(FuncFormatter(format_seconds_to_time))
plt.xlabel('赛事时间')
plt.title('赛事时间分布')
plt.show()

这样就能得到一个正常的分布直方图,而且x轴还是熟悉的时间格式~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:14:24