[英]Python: Timestamp error on matplotlib line plot x-axis
我试图从具有格式的数据的csv文件中生成线图:
Time,Temp
05 Oct 4:35 pm,68
05 Oct 4:30 pm,68
05 Oct 4:20 pm,68
我使用的代码是:
import matplotlib.pyplot as plt
import csv
x = []
y = []
with open('time_temp.csv', 'r') as csvfile:
plots = csv.reader(csvfile, delimiter=',')
for row in plots:
x.append(int(row[0]))
y.append(int(row[1]))
plt.plot(x, y, label='Loaded from file')
plt.xlabel('Timestamp')
plt.ylabel('Temperature')
plt.title('Temperature by Timestamp')
plt.legend()
plt.show()
但是,它会产生此错误:
Traceback (most recent call last):
File "visualizingdata.py", line 12, in <module>
x.append(int(row[0]))
ValueError: invalid literal for int() with base 10: 'Time'
我相信这是由于时间戳格式引起的,但不知道如何转换。
请帮忙。 谢谢。
这是解决了两个问题的一种解决方案:
with open('time_temp.csv', 'r') as csvfile:
plots = csv.reader(csvfile, delimiter=',')
plots.next()
for row in plots:
temp = row[0].split()
x.append(int(temp[0]))
y.append(int(row[1]))
程序中的第一个问题是您试图使用int
命令将文件头中的字符串转换为int
。 为了避免这种情况,您可以使用plots.next()
跳过标题。
接下来的问题是, row[0]
是一个实际的字符串与日期,不能直接转换为int
使用int
命令。 为了解决这个问题,您可以split()
row[0]
字符串并使用它的第一个元素。 后面的部分保持原样。
这些修改应该可以解决您的实际问题,我认为这是根据x轴上的时间戳显示的时间来绘制数据:
labels = []
y = []
with open('time_temp.csv', 'r') as csvfile:
plots = csv.reader(csvfile, delimiter=',')
plots.next()
for row in plots:
labels.append(row[0])
y.append(int(row[1]))
labels = labels[::-1]
x = range(len(labels))
plt.xticks(x, labels, rotation='horizontal')
这里的新部分是,现在将来自row[0]
时间戳数据附加到列表labels
,该列表labels
随后用于为x轴生成刻度标签。 x轴值实际上只是由range
命令生成的顺序整数,其长度与数据长度匹配。
同样,在您的示例数据集中,日期似乎从最近到最近。 这可以通过使用labels = labels[::-1]
反转标签来解决。 使用xticks
将标签添加到绘图中。
我建议不要重新发明轮子,而是使用一些现有功能直接获取日期时间。 一种选择是使用熊猫。
如果数据看起来像这样(我添加了一些数据以显示不同的间距和无序数据的效果):
Time,Temp
05 Oct 10:32 am,10
05 Oct 4:35 pm,20
05 Oct 4:30 pm,30
05 Oct 4:20 pm,68
代码如下所示:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("data/timetemp.csv")
df["Time"] = pd.to_datetime(df["Time"], format="%d %b %I:%M %p")
df.sort_values("Time", inplace=True)
plt.plot(df["Time"],df["Temp"])
plt.show()
您还可以选择使用熊猫进行绘图:
# optionally use pandas for plotting:
df.plot(x="Time", y="Temp")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.