簡體   English   中英

Python:matplotlib線圖x軸上的時間戳錯誤

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM