[英]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.