2017-10-06 63 views
1

我試圖產生從格式化爲數據csv文件線圖:的Python:上matplotlib線圖x軸時間戳誤差

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' 

我相信這是由於時間戳格式,但不知道如何將它轉換。

請幫忙。謝謝。

+0

我的回答能解決您的眼前錯誤,但我不認爲它實際上解決您的問題 - 你想整個時間戳,因爲它是在文檔中出現在你的X軸? – atru

回答

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將標籤添加到圖中。

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

您還可以選擇使用熊貓進行繪圖:

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

enter image description here