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

如何使用Matplotlib和Pandas生成Timedelta(时间差)直方图?

解决Pandas Timedelta直方图绘制问题

嘿,我来帮你搞定这个Timedelta直方图的问题!我之前也踩过类似的坑——直接用Timedelta类型绘图时,matplotlib经常会在刻度显示或者数值解析上出问题,咱们一步步来解决:

第一步:确认并预处理数据

首先得确保你的目标列确实是timedelta64[ns]类型,先检查一下:

print(df['your_timedelta_column'].dtype)

如果输出不是timedelta64[ns],那得先把字符串或者其他格式转成Timedelta:

df['your_timedelta_column'] = pd.to_timedelta(df['your_timedelta_column'])

另外,别忘了处理NaT(缺失的时间差),不然绘图会报错:

df = df.dropna(subset=['your_timedelta_column'])

方法一:转换为数值单位绘图(最简单直观)

Timedelta本质是时间长度,我们可以把它转换成秒、小时或者天这类数值,这样绘图就和普通数值直方图完全一样了:

import matplotlib.pyplot as plt

# 把Timedelta转换成小时数(你也可以换成total_seconds()得到秒,或者dt.days得到整天数)
delta_hours = df['your_timedelta_column'].dt.total_seconds() / 3600

# 绘制直方图
plt.hist(delta_hours, bins=20, edgecolor='black', alpha=0.7)
plt.xlabel('时间差(小时)')
plt.ylabel('频数')
plt.title('Timedelta分布直方图')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

这种方法的好处是完全避开了Timedelta的绘图兼容问题,刻度和数值都清晰易懂。

方法二:保留Timedelta格式的刻度显示

如果你希望x轴直接显示类似02:30或者1天这样的Timedelta格式,可以把Timedelta转换成datetime类型(matplotlib对datetime的刻度支持更完善),再配合日期格式化工具:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# 用一个基准日期(比如1970-01-01)加上Timedelta,得到datetime对象
delta_datetime = pd.to_datetime('1970-01-01') + df['your_timedelta_column']

# 绘制直方图
plt.hist(delta_datetime, bins=15, edgecolor='black', alpha=0.7)

# 设置x轴刻度格式:这里设置为小时+分钟,你也可以换成'%d天 %H:%M'显示天和时分
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
# 设置刻度间隔:比如每2小时显示一个刻度
plt.gca().xaxis.set_major_locator(mdates.HourLocator(interval=2))

plt.xlabel('时间差')
plt.ylabel('频数')
plt.title('Timedelta分布直方图')
plt.xticks(rotation=45)
plt.tight_layout()  # 自动调整布局,避免刻度被截断
plt.show()

如果用Seaborn的话,逻辑也是一样的——要么转数值,要么转datetime后再绘图,比如:

import seaborn as sns
sns.histplot(data=delta_hours, bins=20, kde=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:28:40