为何无法用Matplotlib/Pandas绘制时间差与电压的散点图?
解决Pandas Timedelta类型数据绘制散点图的TypeError问题
问题根源在于**timedelta64[ms]**类型无法被Matplotlib的scatter函数直接处理:scatter要求x、y数据能被统一为相同的数值类型,但timedelta和float64没有通用的底层数值类型,而plt.plot内部会自动完成timedelta到数值的转换,所以能正常运行。
下面是几种可行的解决方法:
方法1:将Timedelta转换为数值类型后用Matplotlib绘制
把Elapsed Time转换成总毫秒数(或总秒数,根据需求),直接作为散点图的x轴数据:
import matplotlib.pyplot as plt # 转换为总毫秒数(原数据是timedelta64[ms],也可以直接用astype(int)提取数值) x_values = filtered_data['Elapsed Time'].dt.total_seconds() * 1000 # 或者 x_values = filtered_data['Elapsed Time'].astype(int) plt.scatter(x_values, filtered_data['Voltage']) plt.xlabel('Elapsed Time (ms)') plt.ylabel('Voltage') plt.show()
方法2:用Pandas内置绘图函数的话,先新增数值型时间列
先在DataFrame里添加一列转换后的数值型时间,再调用plot.scatter:
# 新增毫秒数列 filtered_data['Elapsed Time (ms)'] = filtered_data['Elapsed Time'].astype(int) # 绘制散点图 filtered_data.plot.scatter(x='Elapsed Time (ms)', y='Voltage')
可选:让x轴显示时间格式
如果希望x轴显示时间格式而非纯数值,可以将转换后的数值再转回datetime类型,然后设置刻度格式化:
import matplotlib.dates as mdates import pandas as pd # 把毫秒数转回datetime x_datetime = pd.to_datetime(filtered_data['Elapsed Time'].astype(int), unit='ms') plt.scatter(x_datetime, filtered_data['Voltage']) # 设置时间显示格式 plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S.%f')) # 自动旋转x轴标签避免重叠 plt.gcf().autofmt_xdate() plt.xlabel('Elapsed Time') plt.ylabel('Voltage') plt.show()
内容的提问来源于stack exchange,提问作者random_engi
相关产品推荐
相关产品推荐

