我正在尝试使用格式化的数据从csv文件生成线图:
<p>
我使用的代码是:
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()
我认为这是由于时间戳格式,但不知道如何转换它。
请帮忙。谢谢。
答案 0 :(得分:0)
这是一个解决了两个问题的解决方案:
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
,该列表稍后用于生成x轴的刻度标签。 x轴值实际上只是使用range
命令生成的顺序整数,其长度与数据长度匹配。
此外,在您的示例数据集中,日期似乎从最近到最近。通过使用labels = labels[::-1]
反转标签来处理这一问题。使用xticks
将标签添加到地块中。
答案 1 :(得分:0)
我建议不要重新发明轮子并使用一些现有功能直接获取日期时间。一种选择是使用熊猫。
如果数据看起来像这样(我添加了一些数据来显示不相似的间距和无序数据的影响):
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()
您也可以选择使用pandas进行绘图:
# optionally use pandas for plotting:
df.plot(x="Time", y="Temp")