Python:matplotlib线图x轴上的时间戳错误

时间:2017-10-06 01:05:51

标签: python r python-2.7 csv matplotlib

我正在尝试使用格式化的数据从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()

我认为这是由于时间戳格式,但不知道如何转换它。

请帮忙。谢谢。

2 个答案:

答案 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()

enter image description here

您也可以选择使用pandas进行绘图:

# optionally use pandas for plotting:
df.plot(x="Time", y="Temp")

enter image description here