pandas绘制散点图以datetime.time为X轴报float()类型错误如何解决
报错原因
pandas的scatter散点图要求x、y轴均为可转换为数值的类型。你提取的longtime_time是datetime.time类型的对象,存储为object dtype,无法被自动转换为数值用于坐标系定位,因此触发类型错误。
解决方案
以下提供两种可直接落地的处理方式:
方案1:转换为timedelta类型后用pandas plot绘制
将时间列转换为距离当日0点的时间差(timedelta类型),pandas可直接识别该类型作为坐标轴:
import datetime import matplotlib.dates as mdates # 转换time对象为timedelta date_merge['longtime_timedelta'] = date_merge['longtime_time'].apply(lambda t: datetime.timedelta(hours=t.hour, minutes=t.minute, seconds=t.second)) # 绘图 ax = date_merge.plot(x="longtime_timedelta", y="value", kind="scatter", figsize=[15, 5], linewidth=0.1, alpha=0.6, color="#003399") # 调整x轴刻度显示为时分秒格式 ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S')) plt.xticks(rotation=45) plt.show()
如果保留了原始的longtime datetime类型字段,可使用更高效的转换方式,无需逐行apply:
date_merge['longtime_timedelta'] = filtered_df_date['longtime'] - filtered_df_date['longtime'].dt.normalize()
方案2:使用matplotlib原生scatter绘制
matplotlib原生散点图对时间类型的兼容性更好,可直接传入datetime.time类型作为x轴参数:
import matplotlib.pyplot as plt import matplotlib.dates as mdates plt.figure(figsize=(15,5)) plt.scatter(date_merge['longtime_time'], date_merge['value'], linewidth=0.1, alpha=0.6, color="#003399") # 调整x轴显示格式 plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S')) plt.xticks(rotation=45) plt.xlabel('longtime_time') plt.ylabel('value') plt.show()
内容的提问来源于stack exchange,提问作者mika
相关产品推荐
相关产品推荐

