2014-09-03 105 views
3

下面的情節Matplotlib忽略時區

import matplotlib 
f= plt.figure(figsize=(12,4)) 
ax = f.add_subplot(111) 
df.set_index('timestamp')['values'].plot(ax=ax) 
ax.xaxis.set_major_locator(matplotlib.dates.HourLocator(interval=1)) 
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%I')) 
plt.show() 

呈現在錯誤的區(GMT)的小時,即使我有:

> df['timestamp'][0] 
Timestamp('2014-09-02 18:37:00-0400', tz='US/Eastern') 

由於事實上,如果我註釋掉線:

ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%I')) 

小時顯示在正確的時區。

爲什麼?

+1

也許試試'ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%I','US/Eastern')' – mixedmath 2014-09-03 23:14:16

+0

@mixedmath我剛試過,它崩潰了我的安裝(所有軟件包和Python的最後版本3 with conda) - – 2014-09-03 23:27:03

+1

爲什麼downvote? – 2014-09-04 20:39:30

回答

3

我想你可以通過設置時區在rcParams具有所期望的功能:

import matplotlib 
matplotlib.rcParams['timezone'] = 'US/Eastern' 

格式化是時區意識到,將時間戳轉換爲您rcParams時區(這可能是在UTC),而如果你不會格式化它,它只需要時間戳並忽略時區。如果我理解正確。

更多閱讀:

+0

耶穌基督,很難找到問題:如果你使用'mdates.DateFormatter',那麼它絕對忽略'plot_date'或'xaxis_date'設置的時區以及任何你使用的,除非你使用tz參數 – 2017-08-17 06:48:23

1

如果你不想改變rcParams(這似乎是一個簡單的辦法),那麼你可以將時區傳遞到mdates.DateFormatter

from dateutil import tz 
mdates.DateFormatter('%H:%M', tz=tz.gettz('Europe/Berlin')) 

問題是mdates.DateFormatter完全忽略你設置像plot_datexaxis_date或任何你使用,這是在2017年中期的話,SAD一切。