2014-09-22 114 views
2

我試圖獲取一個數據框列以在圖表上顯示日期作爲示例「Jan 15,Feb 15等」。但它顯示爲「Feb 115,Mar 115等」我試圖用matplotlib.ticker來修改一些代碼。但是圖表沒有軸出來。這是代碼的簡化版本,不起作用。如何在x軸上爲matplotlib格式化日期

import matplotlib.pyplot as plt 
import matplotlib.ticker as tkr 


# create figure instance 
fig1 = plt.figure(1) 

ax = fig1.add_subplot(2,1,1) 

x = 41640, 41671, 41699, 41730, 41760, 41791 

y = 1, 4, 7, 9, 15, 18 

ax.get_xaxis().set_major_formatter(
    tkr.FuncFormatter(lambda x, p: format((x), '%b %y'))) 


ax.plot_date(x, y) 
fig1.show() 
+2

哈!如果你將你的數字解釋爲Julian日期,115是一年。你的號碼修改了朱利安日期(MJD),還有其他什麼?在任何情況下,標準python格式()都假定輸入的格式片數量很多;你可能想從matplotlib.dates或datetime中得到一些東西。 – mdurant 2014-09-22 15:13:33

+0

@mdurant,不確定。我從MS Excel導入日期,我試着將數據預處理成不同的格式,但得到了相同的結果。我的意思是如果我加載日期格式MMM-YY例如可以matplotlib工作與否?或者即使我加載01/12/2014或任何格式。這可能是因爲美國和英國的日期格式。 – IcemanBerlin 2014-09-23 07:33:28

+0

你知道日期應該是什麼嗎? 如果他們是MJD,您需要添加2400000轉換爲JD和matplotlib.dates.julian2num(或減去1721424)以轉換爲「preleptic Gregorian」,這是您所需要的。 – mdurant 2014-09-23 14:35:16

回答

3

下面是一些工作代碼:

import matplotlib.pyplot as plt 
import matplotlib.ticker as tkr 
import matplotlib.dates as mdates 
import datetime 

# create figure instance 
fig1 = plt.figure(1) 
ax = fig1.add_subplot(2,1,1) 

start_date = datetime.date(1899, 12, 30) 
x = 41640, 41671, 41699, 41730, 41760, 41791 
dates = [start_date + datetime.timedelta(xval) for xval in x] 
y = 1, 4, 7, 9, 15, 18 

ax.xaxis.set_major_locator(mdates.MonthLocator()) 
ax.xaxis.set_minor_locator(mdates.DayLocator(bymonthday=(1,15))) 
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %d')) 
plt.plot(dates, y, 'o') 
plt.show() 

說明:

原來在MS Excel序列日期從12月30日,1899年開始即0號是1899年12月30日, 1對應於1899年12月31日(自己在Excel中試用它^ _ ^)。雖然the Excel help表示「1900年1月1日是序列號1」,但這是不正確的,因爲有an early bug似乎是固定的。

要將Excel序列日期轉換爲Python日期時間對象,請檢出datetime.timedelta

要在matplotlib中繪製日期時間,請檢出其demoAPI