2017-10-06 12 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' 

は、しかしそれは、このエラーを生成します。

助けてください。ありがとうございました。あなたのプログラムの最初の問題は、あなたがintコマンドを使用してintにファイルヘッダ内の文字列を変換しようとしているということです

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])) 

:ここ

+0

私の答えはあなたの即時のエラーを解決しますが、私はそれが実際にあなたの問題を解決しないと思いますか? – atru

答えて

0

固定された2つの問題を持つ一つの解決策です。これを避けるには、plots.next()を使用してヘッダーをスキップできます。

次の問題はrow[0]intコマンドを使用してintに直接変換できない日付の実際の文字列であることです。これを修正するにはsplit()row[0]文字列を使用し、それを最初の要素として使用します。後の部分はそのままです。

ここ
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]からタイムスタンプデータがあるということです。

これらの変更は、私は、x軸上のタイムスタンプとして登場する時間に対してデータをプロットされたと仮定し、あなたの実際の問題を解決する必要があります後でx軸の目盛りラベルを生成するために使用されるリストlabelsに追加されます。 x軸の値は、実際には、データ長と一致する長さのrangeコマンドで生成された連続した整数だけです。

また、あなたのサンプルデータセットでは、日付は最近の日付から最近の日付に近いようです。これは、labels = labels[::-1]を使用してラベルを反転することによって処理されます。ラベルはxticksを使用してプロットに追加されます。

0

私は車輪を作り直したり、既存の機能を使って直接日付時刻を取得しないことをお勧めします。 1つの選択肢は、パンダを使用することです。

データはこのようになります場合は(私は、異なる間隔と順不同データの効果を示すために、いくつかのデータを追加):

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

プロンプトでパンダを使用することもできます。

それはあなたのx軸に表示する文書であるとして、あなたが全体のタイムスタンプが欲しい -

enter image description here

関連する問題