格式化日期时间标签以包括pandas plot的工作日名称

时间:2015-08-14 09:43:29

标签: python datetime pandas matplotlib

我想将相应的工作日名称(周一,周二等)添加到xlabels中,以获取大熊猫时间序列图。

timeline graph

import pandas as pd
import numpy as np
import pylab as p
import datetime

dates = pd.date_range(datetime.datetime.today().date(), periods=10, freq='D')
data = pd.DataFrame(np.arange(10),index=dates,columns=['A'])
a = data['A'].plot()
p.tight_layout()
p.show()

我尝试使用以下方法调整格式:

from matplotlib.dates import DateFormatter
formatter = DateFormatter('%a %d-%m-%Y')
a.xaxis.set_major_formatter(formatter)

但这不起作用,导致日期和年份不正确。

似乎应该有一个非常简单的解决方案,但我找不到它。

1 个答案:

答案 0 :(得分:2)

这是我认为可行的但却没有:

from matplotlib.ticker import FuncFormatter
from matplotlib import pyplot as plt

ax = data.A.plot()
ax.xaxis.set_major_formatter(FuncFormatter(lambda d, _: d.strftime('%a')))

ax = plt.subplot()
ax.plot(data.index, data.A)
ax.xaxis.set_major_formatter(FuncFormatter(lambda d, _: d.strftime('%a')))

这两种方式都有不同之处。在两种情况下,格式化程序输入似乎都是floats而不是日期。在第一个函数中,函数仅应用于第一个和最后一个刻度。您可以通过传递

来看到这一点
ax.xaxis.set_major_formatter(FuncFormatter(lambda d, _: d) 

这是一个非常灵活的解决方案:

ax = plt.subplot()
ax.plot(data.index, data.A)
ticks = ax.set_xticklabels([d.strftime('%a') for d in data.index])

你可以在最后一行交换列表理解,无论你喜欢什么。

编辑:

我想我已经弄清楚这些代表xticks的数字是什么意思。

In [37]: 
ax = plt.subplot()
ax.plot(data.index, data.A)
print  ax.get_xticks()
[ 735824.  735825.  735826.  735827.  735828.  735829.  735830.  735831.
  735832.  735833.]

这些似乎代表自公元1年开始以来的天数:根据:http://www.epochconverter.com/epoch/seconds-days-since-year-0.php

“0000-00-00和今天(2015年8月14日)之间有736189天。”

这正是735824(第一个滴答)+ 365.到目前为止一直很糟糕。 你可以(我不会打扰)编写一个函数来将这个数字转换成日期。另一种方法是:

def get_day(tick):
    date = dates[0] + datetime.timedelta(tick - ticks[0])
    return date.strftime('%a')

ax = plt.subplot()
ax.plot(data.index, data.A)
ticks = ax.get_xticks()
ax.xaxis.set_major_formatter(FuncFormatter(lambda tick, _: get_day(tick)))

同样,您可以将所需的日期格式转换为get_day。不确定这是否会解决平移/缩放问题,但至少它提供了一种使用函数设置刻度标签的方法。