web-dev-qa-db-ja.com

Pythonのmatplotlibを使用してx軸に日付をプロットする

日付に対して情報をプロットしようとしています。 「01/02/1991」という形式の日付のリストがあります。

以下を実行して変換しました。

x = parser.parse(date).strftime('%Y%m%d'))

19910102を与えます

次に、num2dateを使用しようとしました

import matplotlib.dates as dates
new_x = dates.num2date(x)

プロット:

plt.plot_date(new_x, other_data, fmt="bo", tz=None, xdate=True)

しかし、エラーが発生します。 「ValueError:year is out of range」です。解決策はありますか?

54
irl_irl

@KyssTaoが言っているように、help(dates.num2date)は、xが0001-01-01からの日数に1を加えた浮動小数点数でなければならないことを示しています。したがって、19910102は1991年1月2日ではありません。0001-01-01から19910101日をカウントすると、54513年またはそれに類似した年(365.25で除算した日数)になります。

代わりにdatestr2numを使用してください(help(dates.datestr2num)を参照):

new_x = dates.datestr2num(date) # where date is '01/02/1991'
19

これを行うには、plot()の代わりにplot_date()を使用します。

まず、文字列をPython datetime.dateのインスタンスに変換します。

import datetime as dt

dates = ['01/02/1991','01/03/1991','01/04/1991']
x = [dt.datetime.strptime(d,'%m/%d/%Y').date() for d in dates]
y = range(len(x)) # many thanks to Kyss Tao for setting me straight here

次にプロットする:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.plot(x,y)
plt.gcf().autofmt_xdate()

結果:

enter image description here

105
bernie