Python:使用DataFrame绘制线图和条形图时DatetimeIndex的不同行为

Python:使用DataFrame绘制线图和条形图时DatetimeIndex的不同行为,python,pandas,Python,Pandas,我有一个数据框,行索引作为DatetimeIndex 当我绘制直线和条形图时,这个指数在x轴上的显示方式不同。我的代码如下: start_date = datetime.datetime.strptime('2017-02-20', '%Y-%m-%d').date() end_date = datetime.datetime.strptime('2017-02-23', '%Y-%m-%d').date() daterange = pd.date_range(start_date, end_

我有一个数据框,行索引作为DatetimeIndex

当我绘制直线和条形图时,这个指数在x轴上的显示方式不同。我的代码如下:

start_date = datetime.datetime.strptime('2017-02-20', '%Y-%m-%d').date()
end_date = datetime.datetime.strptime('2017-02-23', '%Y-%m-%d').date()

daterange = pd.date_range(start_date, end_date)
df = pd.DataFrame(index = daterange, data = {'Male':[12, 23, 13, 11], 'Female': [10, 25, 15, 9]})


df.plot(kind='line')
df.plot(kind='bar', stacked = False, grid=1)
ax = df.plot(kind='bar', stacked = False)
ax.set_xticklabels([t.get_text().split()[0] for t in ax.get_xticklabels()])
我得到的情节如下。在x轴上具有良好日期格式的线图:

不在x轴上设置日期格式的条形图:

在直线图中,x轴标签的格式良好,左角有月份和年份,日期用作x记号。但在条形图中,整个日期和时间(00:00:00)的显示方式与线形图不同


如何在不显示时间的情况下,在条形图中获得x轴上日期的正确格式?

问题出在
pandas
的源代码中。如果不派生自定义子类或直接使用
matplotlib
,则无法使条形图使用
pd.DateTimeFormatter

pandas.tools.plotting
的第1766行中,完成了
LinePlot
的日期时间格式设置。这在
条形图中不存在,原因我只能假设:

折线图用于打印时间序列数据,而柱状图则不一定如此

我仍然希望条形图能够在不使用matplotlib的情况下正确设置日期格式,因此您可能希望打开
pandas
项目的一个问题

直接使用
matplotlib

import pandas as pd
import datetime
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt

start_date = datetime.datetime.strptime('2017-02-20', '%Y-%m-%d').date()
end_date = datetime.datetime.strptime('2017-02-23', '%Y-%m-%d').date()
daterange = pd.date_range(start_date, end_date)
df = pd.DataFrame(index = daterange, data = {'Male':[12, 23, 13, 11], 'Female': [10, 25, 15, 9]})

条形图通常用于绘制分类数据。这意味着与线形图不同,x值只是升序整数值,而不是日期。然后,标签就是数据框中的文本

摆脱小时和分钟的一个简单选项是按如下方式重置标签:

start_date = datetime.datetime.strptime('2017-02-20', '%Y-%m-%d').date()
end_date = datetime.datetime.strptime('2017-02-23', '%Y-%m-%d').date()

daterange = pd.date_range(start_date, end_date)
df = pd.DataFrame(index = daterange, data = {'Male':[12, 23, 13, 11], 'Female': [10, 25, 15, 9]})


df.plot(kind='line')
df.plot(kind='bar', stacked = False, grid=1)
ax = df.plot(kind='bar', stacked = False)
ax.set_xticklabels([t.get_text().split()[0] for t in ax.get_xticklabels()])

另外添加
ax.figure.autofmtxdate()
旋转和重新居中标签以减少空间


使用此解决方案,我可以使用strftime()函数的不同指令来获取工作日名称,还可以使用更多指令来向我的图形中添加其他详细信息,例如%a来获取缩写的工作日名称。我使用与您的解决方案相同的代码在xticks上获取线图的工作日名称,但它不起作用,只给了我一个空图。它是否与线条图的现有格式冲突?