2014-10-29 64 views
6

this answer's use of DateFormatter,我試圖繪製一個時間序列,用大熊貓0.15.0多年標註其X軸和matplotlib 1.4.2:當我使用matplotlib的DateFormatter在x軸上格式化日期時,爲什麼我得到「python int太大而無法轉換爲C long」錯誤?

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: Exception in image/png formatter: Python int too large to convert to C long FormatterWarning, Traceback (most recent call last):

File "", line 1, in runfile('D:/username/latex_template/new_pandas_example.py', wdir='D:/username/latex_template')

File "C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 580, in runfile execfile(filename, namespace)

File "C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 48, in execfile exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)

File "D:/username/latex_template/new_pandas_example.py", line 18, in fig.savefig('test.eps')

File "C:\Anaconda3\lib\site-packages\matplotlib\figure.py", line 1470, in savefig self.canvas.print_figure(*args, **kwargs)

File "C:\Anaconda3\lib\site-packages\matplotlib\backend_bases.py", line 2194, in print_figure **kwargs)

File "C:\Anaconda3\lib\site-packages\matplotlib\backends\backend_ps.py", line 992, in print_eps return self._print_ps(outfile, 'eps', *args, **kwargs)

File "C:\Anaconda3\lib\site-packages\matplotlib\backends\backend_ps.py", line 1020, in _print_ps **kwargs)

File "C:\Anaconda3\lib\site-packages\matplotlib\backends\backend_ps.py", line 1110, in _print_figure self.figure.draw(renderer)

File "C:\Anaconda3\lib\site-packages\matplotlib\artist.py", line 59, in draw_wrapper draw(artist, renderer, *args, **kwargs)

File "C:\Anaconda3\lib\site-packages\matplotlib\figure.py", line 1079, in draw func(*args)

File "C:\Anaconda3\lib\site-packages\matplotlib\artist.py", line 59, in draw_wrapper draw(artist, renderer, *args, **kwargs)

File "C:\Anaconda3\lib\site-packages\matplotlib\axes_base.py", line 2092, in draw a.draw(renderer)

File "C:\Anaconda3\lib\site-packages\matplotlib\artist.py", line 59, in draw_wrapper draw(artist, renderer, *args, **kwargs)

File "C:\Anaconda3\lib\site-packages\matplotlib\axis.py", line 1114, in draw ticks_to_draw = self._update_ticks(renderer)

File "C:\Anaconda3\lib\site-packages\matplotlib\axis.py", line 957, in _update_ticks tick_tups = [t for t in self.iter_ticks()]

File "C:\Anaconda3\lib\site-packages\matplotlib\axis.py", line 957, in tick_tups = [t for t in self.iter_ticks()]

File "C:\Anaconda3\lib\site-packages\matplotlib\axis.py", line 905, in iter_ticks for i, val in enumerate(majorLocs)]

File "C:\Anaconda3\lib\site-packages\matplotlib\axis.py", line 905, in for i, val in enumerate(majorLocs)]

File "C:\Anaconda3\lib\site-packages\matplotlib\dates.py", line 411, in call dt = num2date(x, self.tz)

File "C:\Anaconda3\lib\site-packages\matplotlib\dates.py", line 345, in num2date return _from_ordinalf(x, tz)

File "C:\Anaconda3\lib\site-packages\matplotlib\dates.py", line 225, in _from_ordinalf dt = datetime.datetime.fromordinal(ix)

OverflowError: Python int too large to convert to C long

我在這裏用DateFormatter不正確嗎?我怎樣才能在matplotlib數字的a軸上輕鬆放置年份(或任何時間格式,因爲我的時間序列可能不同)?

回答

11

這是熊貓0.15(由於指數的重構)一「迴歸」,見https://github.com/matplotlib/matplotlib/issues/3727https://github.com/pydata/pandas/issues/8614,但固定在0.15.1


簡單地說:matplotlib現在看到大熊貓指數爲datetime64[ns]值(這實際上是非常大的int64s)的陣列,而不是時間戳(其是datetime.datetime的子類的一個陣列,並且可以處理由matplotlib)在先前版本的熊貓中。所以潛在的原因是,matplotlib不處理datetime64作爲日期值,而是作爲整數。

大熊貓0.15.0(但最好升級到更新的版本),有兩種可能的變通方法

  • 註冊datetime64類型,所以它也將作爲由matplotlib日期處理:

    units.registry[np.datetime64] = pd.tseries.converter.DatetimeConverter() 
    
  • 還是DatetimeIndex(具有datetime64值)轉換爲datetime.datetime值的陣列與to_pydatetime方法,並繪製此:

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

相關的問題:Plotting datetimeindex on x-axis with matplotlib creates wrong ticks in pandas 0.15 in contrast to 0.14

+0

感謝您的回答;你是正確的,這是熊貓0.15.1固定的。我今天早上剛剛更新了,我的原始代碼示例完全按照預期工作。 (也許編輯你的問題,包括那個?) – 2014-11-11 18:24:16

+0

是的,謝謝,更新了答案。 – joris 2014-11-11 22:44:38

+1

好吧,問題似乎已經回到0.21.0 ....:S – ntg 2017-11-24 09:17:30

相關問題