2014-09-22 81 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