2015-08-14 2 views
4

Я хотел бы добавить соответствующие имена будних дней (пн, Вт и т. Д.) В 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) 

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

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

+0

Кажется, что 'date.weekday' должен каким-то образом помочь? – tom

ответ

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]) 

Вы можете поменять список понимание в последней строке для все, что вы хотели.

EDIT:

Я думаю, что я понять, что эти цифры, представляющие 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.] 

Они, кажется, представляют собой количество дней, прошедших с начала AD 1: В соответствии с этим: http://www.epochconverter.com/epoch/seconds-days-since-year-0.php

«Есть 736189 дней между 0000-00-00 и сегодня (14 августа 2015) «.

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

+0

К сожалению, при масштабировании или панорамировании графика метки меняются и не выравниваются с точками данных. – fraxel

+0

У меня нет опыта с панорамированием или масштабированием с помощью 'matplotlib'. Не уверен, что делать тогда. – JoeCondron

+0

Хорошо, я отредактировал ответ, чтобы включить решение, используя (очень взломанную) функцию. Может быть, это решит проблему панорамирования/масштабирования. – JoeCondron

Смежные вопросы