Pandas Dataframe线图在xaxis上显示日期

时间:2017-05-27 06:34:28

标签: 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()

enter image description here

我最后添加了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

enter image description here

第二张图表的问题在于它从5-24而不是5-25开始。另外,2017年5-25是星期四而不是星期一。是什么导致了这个问题?这个时区有关系吗? (我不明白为什么日期数字叠加在一起)

1 个答案:

答案 0 :(得分:8)

通常,pandas和matplotlib的日期时间实用程序不兼容。因此,尝试在使用pandas创建的日期轴上使用matplotlib.dates对象将在大多数情况下失败。

一个原因是例如从the documentation

看到
  

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

但是,这不是唯一的区别,因此建议在日期时间对象中不要混合使用pandas和matplotlib。

但是可以选择告诉大熊猫不要使用自己的日期时间格式。在这种情况下,使用matplotlib.dates代码是可能的。这可以通过。

来引导
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()

enter image description here