Python xaxis上的数据框线图显示日期

Python xaxis上的数据框线图显示日期,python,pandas,datetime,matplotlib,Python,Pandas,Datetime,Matplotlib,比较以下代码: test = pd.DataFrame({'date':['20170527','20170526','20170525'],'ratio1':[1,0.98,0.97]}) test['date'] = pd.to_datetime(test['date']) test = test.set_index('date') ax = test.plot() 我在最后添加了DateFormatter: test = pd.DataFrame({'date':['20170527'

比较以下代码:

test = pd.DataFrame({'date':['20170527','20170526','20170525'],'ratio1':[1,0.98,0.97]})
test['date'] = pd.to_datetime(test['date'])
test = test.set_index('date')
ax = test.plot()

我在最后添加了
DateFormatter

test = pd.DataFrame({'date':['20170527','20170526','20170525'],'ratio1':[1,0.98,0.97]})
test['date'] = pd.to_datetime(test['date'])
test = test.set_index('date')
ax = test.plot()
ax.xaxis.set_minor_formatter(dates.DateFormatter('%d\n\n%a')) ## Added this line


第二个图形的问题是它从
5-24
开始,而不是
5-25
。此外,2017年的
5-25
是周四而不是周一。是什么导致了这个问题?这个时区相关吗?(我也不明白为什么日期数字堆叠在一起)

一般来说,pandas和matplotlib的日期时间实用程序是不兼容的。因此,尝试在使用pandas创建的日期轴上使用
matplotlib.dates
对象在大多数情况下都会失败

一个原因是,例如,从

datetime
对象被转换为浮点数,这些浮点数表示自UTC 0001-01-01以来的时间,加1。例如,0001-01-01,06:00是1.25,而不是0.25

但是,这并不是唯一的区别,因此在涉及datetime对象时,建议不要混合使用pandas和matplotlib

但是,可以选择告诉熊猫不要使用自己的日期时间格式。在这种情况下,可以使用
matplotlib.dates
ticker。这可以通过以下方式进行控制

df.plot(x_compat=True)
由于pandas不提供复杂的日期格式化功能,因此可以使用matplotlib进行打印和格式化

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as dates

df = pd.DataFrame({'date':['20170527','20170526','20170525'],'ratio1':[1,0.98,0.97]})
df['date'] = pd.to_datetime(df['date'])

usePandas=True
#Either use pandas
if usePandas:
    df = df.set_index('date')
    df.plot(x_compat=True)
    plt.gca().xaxis.set_major_locator(dates.DayLocator())
    plt.gca().xaxis.set_major_formatter(dates.DateFormatter('%d\n\n%a'))
    plt.gca().invert_xaxis()
    plt.gcf().autofmt_xdate(rotation=0, ha="center")
# or use matplotlib
else:
    plt.plot(df["date"], df["ratio1"])
    plt.gca().xaxis.set_major_locator(dates.DayLocator())
    plt.gca().xaxis.set_major_formatter(dates.DateFormatter('%d\n\n%a'))
    plt.gca().invert_xaxis()

plt.show()