Форматировать ярлыки даты и времени, чтобы включить название дня недели для участка панды

Я хотел бы добавить соответствующие имена будних дней (Mon, Вт и т. Д.) В xlabels для графика pandas timeseries.

график временной шкалы

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) 

Но это не работает, что приводит к неправильному дню и году.

Кажется, должно быть очень простое решение, но я не могу его найти.

Вот что я подумал бы, но не сделал:

 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 означают эти цифры, обозначающие 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 и сегодня (14 августа 2015 г.) есть 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 формат даты, который вы хотите получить в get_day . Не уверен, что это решит проблему панорамирования / масштабирования, но, по крайней мере, дает возможность установить метки меток с помощью функции.