Python3读取CSV绘制时间序列遇KeyError: 'TimeStamp'问题求助
问题排查:读取CSV绘制时间序列图时的KeyError: 'TimeStamp'
问题详情
尝试从CSV文件绘制Temperature和Voltage的时间序列图时,始终抛出KeyError: 'TimeStamp',报错栈如下:
The above exception was the direct cause of the following exception: Traceback (most recent call last): File "Date_Time_Experiment.py", line 10, in data['TimeStamp'] = pd.to_datetime(data['TimeStamp'], format='%d/%m/%Y-%H:%M:%S') File "/home/pi/.local/lib/python3.7/site-packages/pandas/core/frame.py", line 3458, in __getitem__ indexer = self.columns.get_loc(key) File "/home/pi/.local/lib/python3.7/site-packages/pandas/core/indexes/base.py", line 3363, in get_loc raise KeyError(key) from err KeyError: 'TimeStamp'
使用的代码如下:
import pandas as pd import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from datetime import datetime plt.style.use('fivethirtyeight') def animate(i): data = pd.read_csv('Logging.csv', skiprows=1) data['TimeStamp'] = pd.to_datetime(data['TimeStamp'], format='%d/%m/%Y-%H:%M:%S') x=data['TimeStamp'] y1=data['Temperature'] y2=['Voltage'] plt.cla() plt.plot(x,y1,label='Temperature') plt.plot(x,y2,label='Voltage') plt.legend(loc='upper left') plt.tight_layout() ani=FuncAnimation(plt.gcf(),animate, interval=61000) plt.tight_layout() plt.show()
CSV文件结构:
| TimeStamp | Temperature | Voltage |
|---|---|---|
| 07/03/2023-15:33:45 | 20.595 | 10.04591440 |
| 07/03/2023-16:15:32 | 20.630 | 10.04591070 |
问题根源
- 核心错误:
skiprows=1参数导致表头丢失
你的CSV第一行是表头(TimeStamp、Temperature、Voltage),但pd.read_csv('Logging.csv', skiprows=1)会跳过第一行,导致pandas把第一行数据当成表头,自然找不到名为'TimeStamp'的列。 - 次要错误:Voltage列取值错误
代码中y2=['Voltage']是一个字符串列表,而非从data中读取的数值列,会导致后续绘图失败。
修复后的代码
import pandas as pd import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation plt.style.use('fivethirtyeight') def animate(i): # 去掉skiprows=1保留表头,同时在读取时直接解析时间列提升效率 data = pd.read_csv( 'Logging.csv', parse_dates=['TimeStamp'], date_format='%d/%m/%Y-%H:%M:%S' ) x = data['TimeStamp'] y1 = data['Temperature'] y2 = data['Voltage'] # 修正为读取data中的Voltage列 plt.cla() plt.plot(x, y1, label='Temperature') plt.plot(x, y2, label='Voltage') plt.legend(loc='upper left') plt.xticks(rotation=45) # 新增:旋转x轴标签避免重叠 plt.tight_layout() ani = FuncAnimation(plt.gcf(), animate, interval=61000) plt.tight_layout() plt.show()
额外优化建议
- 如果CSV文件在持续追加新数据,可以只读取最新的N行减少资源占用:
data = pd.read_csv('Logging.csv', parse_dates=['TimeStamp'], date_format='%d/%m/%Y-%H:%M:%S').tail(50) - 可以添加x轴标签和标题,提升图表可读性:
plt.xlabel('Time')、plt.title('Temperature & Voltage Time Series')
内容的提问来源于stack exchange,提问作者cat87
相关产品推荐
相关产品推荐

