3

気象データの CSV ファイルをプロットしています。コードに問題なくインポートできましたが、プロットしようとしています。CSV データのサンプルを次に示します。

12:00am,171,6,7,52,76,77.1,63.7,28.74,0.00,0.00,0.0,0,63.7,78.1,67.4,56.0,29.96
12:01am,192,4,6,52,76,77.1,63.7,28.74,0.00,0.00,0.0,0,63.7,78.1,67.4,56.0,29.96
12:02am,197,3,6,52,76,77.1,63.7,28.74,0.00,0.00,0.0,0,63.7,78.1,67.4,56.0,29.96
12:03am,175,3,6,52,76,77.1,63.7,28.73,0.00,0.00,0.0,0,63.7,78.1,67.4,56.0,29.96
12:04am,194,4,6,52,76,77.1,63.7,28.73,0.00,0.00,0.0,0,63.7,78.1,67.4,56.0,29.96
12:05am,148,5,6,52,76,77.1,63.7,28.73,0.00,0.00,0.0,0,63.7,78.1,67.4,56.0,29.96

とにかく、時間を X 軸にしたいのですが、matplotlib を使用してプロットすることはできません。xticks を使用した方法を試してみたところ、y 値がプロットされましたが、それだけでした。X軸に太い実線が表示されました。

import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
from matplotlib.dates import date2num
import datetime as DT
import re

data = np.genfromtxt('FILE.csv', delimiter=',', dtype=None, skip_header=3)
length = len(data)

x = data['f0']
y = data['f7']

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_title("Temperature")    
ax1.set_xlabel('Time')
ax1.set_ylabel('Degrees')


#plt.plot_date(x, y)
plt.show()
leg = ax1.legend()

plt.show()

正直なところ、ここからどこに行くべきか分からないため、いくつかの重要な部分が欠けています。numpy 配列のデータ型を確認したところ、numpy.ndarray と言い続けていましたが、それを文字列または int 値に変換してプロットする方法が見つかりません。これは 24 時間の CSV ファイルで、30 分ごとに目盛りを付けたいと思います。何か案は?

4

2 に答える 2

1

これはあまりエレガントではありませんが、機能します。重要なのは、matploblib がそれらをプロットできるように、単なる文字列である に格納されxている時刻を datetime オブジェクトに変更することです。変換を行う関数を作成し、それを呼び出しましたget_datetime_from_string

** Python 2.7 と互換性があり、1 桁の時間で動作するようにコードを編集しました **

import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
from matplotlib.dates import date2num
import datetime as DT
import re

def get_datetime_from_string(time_string):
    ''' Returns a datetime.datetime object

        Args
        time_string: a string of the form 'xx:xxam'
        '''

    # there's got to be a better way to do this.
    # Convert it to utf-8 so string slicing works as expected.
    time_string = unicode(time_string, 'utf-8')

    # period is either am or pm
    colon_position = time_string.find(':')
    period = time_string[-2:]
    hour = int(time_string[:colon_position])
    if period.lower() == 'pm':
        hour += 12

    minute = int(time_string[colon_position + 1:colon_position + 3])

    return DT.datetime(1,1,1,hour, minute)

data = np.genfromtxt('test.csv', delimiter=',', dtype=None, skip_header=3)
length=len(data)

x=data['f0']
y=data['f7']

datetimes = [get_datetime_from_string(t) for t in x]

fig = plt.figure()

ax1 = fig.add_subplot(111)

ax1.set_title("Temperature")    
ax1.set_xlabel('Time')
ax1.set_ylabel('Degrees')

plt.plot(datetimes, y)
leg = ax1.legend()

plt.show()

time_stringに変換する前に文字列のスライスを実行しようとしていたため、つまずき続けましたutf-8。それが私にASCII値か何かを与える前に。なぜ変換が役に立ったのかはわかりませんが、役に立ちました。

于 2013-07-04T21:33:55.680 に答える