matplotlibのDateFormatterを使用してx軸の日付をフォーマットすると、「python intが大きすぎてClongに変換できない」エラーが発生するのはなぜですか?

マイケルA

この回答でDateFormatterを使用した pandas0.15.0とmatplotlib1.4.2を使用して、時系列をプロットし、そのx軸に年のラベルを付けようとしました。

import datetime as dt
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas.io.data as pdio
import scipy as sp

t1 = dt.datetime(1960, 1, 1)
t2 = dt.datetime(2014, 6, 1)
data = pdio.DataReader("GS10", "fred", t1, t2).resample("Q", how=sp.mean)

fig, ax1 = plt.subplots()
ax1.plot(data.index, data.GS10)
ax1.set_xlabel("Year")
ax1.set_ylabel("Rate (%)")
ax1.xaxis.set_major_formatter(mpl.dates.DateFormatter("%Y"))
fig.suptitle("10-yr Treasury Rate", fontsize=14)

fig.savefig('test.eps')

最後の行はエラーをスローします:OverflowError: Python int too large to convert to C long このトレースバックで:

C:\ Anaconda3 \ lib \ site-packages \ IPython \ core \ formatters.py:239:FormatterWarning:image / pngフォーマッターの例外:Python intが大きすぎてCに変換できませんFormatterWarning、トレースバック(最新の呼び出しが最後):

ファイル ""、1行目、runfile( 'D:/username/latex_template/new_pandas_example.py'、wdir =' D:/ username /ラテックス_template ')

ファイル "C:\ Anaconda3 \ lib \ site-packages \ spyderlib \ widgets \ externalshell \ sitecustomize.py"、行580、runfile execfile(filename、namespace)

ファイル "C:\ Anaconda3 \ lib \ site-packages \ spyderlib \ widgets \ externalshell \ sitecustomize.py"、48行目、execfile exec(compile(open(filename、 'rb')。read()、filename、 'exec ')、名前空間)

ファイル「D:/username/latex_template/new_pandas_example.py」、18行目、fig.savefig( 'test.eps')

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ figure.py"、1470行目、savefig self.canvas.print_figure(* args、** kwargs)

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ backend_bases.py"、2194行目、print_figure ** kwargs)

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ backends \ backend_ps.py"、992行目、print_epsはself._print_ps(outfile、 'eps'、* args、** kwargs)を返します。

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ backends \ backend_ps.py"、行1020、_print_ps ** kwargs)

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ backends \ backend_ps.py"、行1110、_print_figure self.figure.draw(renderer)

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ artist.py"、59行目、draw_wrapper draw(artist、renderer、* args、** kwargs)

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ figure.py"、行1079、描画func(* args)

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ artist.py"、59行目、draw_wrapper draw(artist、renderer、* args、** kwargs)

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ axes_base.py"、行2092、draw a.draw(renderer)

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ artist.py"、59行目、draw_wrapper draw(artist、renderer、* args、** kwargs)

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ axis.py"、1114行目、draw ticks_to_draw = self._update_ticks(renderer)

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ axis.py"、行957、_update_ticks tick_tups = [t for t in self.iter_ticks()]

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ axis.py"、行957、tick_tups = [t for t in self.iter_ticks()]

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ axis.py"、行905、iter_ticks for i、val in enumerate(majorLocs)]

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ axis.py"、行905、in for i、val in enumerate(majorLocs)]

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ days.py"、行411、呼び出しdt = num2date(x、self.tz)

ファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ dates.py"、行345、num2date return _from_ordinalf(x、tz)

_from_ordinalf dt = datetime.datetime.fromordinal(ix)のファイル "C:\ Anaconda3 \ lib \ site-packages \ matplotlib \ dates.py"、行225

OverflowError:Pythonintが大きすぎてClongに変換できません

DateFormatterここで間違って使用していますか?matplotlib図のa軸に年(または時系列が異なる場合があるため、任意の時間形式)を簡単に配置するにはどうすればよいですか?

ヨリス

これはパンダ0.15の「回帰」です(インデックスのリファクタリングによる)。https://github.com/matplotlib/matplotlib/issues/3727およびhttps://github.com/pydata/pandas/issues/8614を参照してください、ただし0.15.1で修正されています


短編小説:matplotlibは、datetime64[ns]以前のバージョンのパンダのタイムスタンプの配列(datetime.datetimeのサブクラスであり、matplotlibで処理できる)ではなく、パンダのインデックスを値の配列(実際には非常に大きなint64)と見なすようになりました。 。したがって、根本的な理由は、matplotlibがdatetime64を日付値としてではなくintとして処理することです。

パンダ0.15.0(ただし、新しいバージョンへのアップグレードの方が良い)の場合、2つの回避策が考えられます。

  • datetime64タイプを登録して、matplotlibによって日付としても処理されるようにします。

    units.registry[np.datetime64] = pd.tseries.converter.DatetimeConverter()
    
  • または、DatetimeIndex(datetime64値を含む)をメソッドを使用してdatetime.datetime値の配列に変換し、to_pydatetimeこれをプロットします。

    ax1.plot(data.index.to_pydatetime(), data.GS10)
    

関連する質問:matplotlibを使用してx軸にdatetimeindexをプロットすると、0.14とは対照的にパンダ0.15で間違ったティックが作成されます

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ