Pandas Plots: отдельный цвет для выходных, довольно время печати по оси x

Я создал сюжет, который выглядит введите описание изображения здесь

У меня есть несколько вопросов:

  1. Как я могу конкретно показать выходные. Некоторые способы, которые я думал, были захватить индексы, соответствующие выходным дням, а затем рисовать прозрачные полосы между xlim. Также можно рисовать прямоугольник. Было бы лучше, если бы это можно было сделать прямо в Пандах.
  2. Форматирование даты не самое красивое

Ниже приведен код, используемый для создания этого участка

ax4=df4.plot(kind='bar',stacked=True,title='Mains 1 Breakdown'); ax4.set_ylabel('Power (W)'); idx_weekend=df4.index[df4.index.dayofweek>=5] ax.bar(idx_weekend.to_datetime(),[1800 for x in range(10)]) 

ax.bar специально предназначен для выделения выходных дней, но он не дает видимых результатов. (Проблема 1) Для проблемы 2 я попытался использовать Major Formatter и Locators, код выглядит следующим образом:

 ax4=df4.plot(kind='bar',stacked=True,title='Mains 1 Breakdown'); ax4.set_ylabel('Power (W)'); formatter=matplotlib.dates.DateFormatter('%d-%b'); locator=matplotlib.dates.DayLocator(interval=1); ax4.xaxis.set_major_formatter(formatter); ax4.xaxis.set_major_locator(locator); 

Вывод производится следующим образом: введите описание изображения здесь

Может быть полезно узнать, как выглядит Dataframe

 In [122]:df4 Out[122]: <class 'pandas.core.frame.DataFrame'> DatetimeIndex: 36 entries, 2011-04-19 00:00:00 to 2011-05-24 00:00:00 Data columns: (0 to 6 AM) Dawn 19 non-null values (12 to 6 PM) Dusk 19 non-null values (6 to 12 Noon) Morning 19 non-null values (6PM to 12 Noon) Night 20 non-null values dtypes: float64(4) 

2 Solutions collect form web for “Pandas Plots: отдельный цвет для выходных, довольно время печати по оси x”

Я много пробовал, и пока эти хаки работают. Ожидайте более Pythonic и последовательные решения. Решение проблем с маркировкой:

 def correct_labels(ax): labels = [item.get_text() for item in ax.get_xticklabels()] days=[label.split(" ")[0] for label in labels] months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"] final_labels=[] for i in range(len(days)): a=days[i].split("-") final_labels.append(a[2]+"\n"+months[int(a[1])-1]) ax.set_xticklabels(final_labels) 

Также при построении графика я делаю следующее изменение

 ax=df.plot(kind='bar',rot=0) 

Это делает метки с 0 вращением.

Для поиска выходных и выделения их я написал следующие две функции:

 def find_weekend_indices(datetime_array): indices=[] for i in range(len(datetime_array)): if datetime_array[i].weekday()>=5: indices.append(i) return indices def highlight_weekend(weekend_indices,ax): i=0 while i<len(weekend_indices): ax.axvspan(weekend_indices[i], weekend_indices[i]+2, facecolor='green', edgecolor='none', alpha=.2) i+=2 

Теперь сюжет выглядит намного полезнее и охватывает эти варианты использования. введите описание изображения здесь

Теперь, когда Pandas поддерживает мощное пространство имен .dt в каждой серии, можно определить начало и конец каждого выходного дня без каких-либо явных петель Python. Просто отфильтруйте свои значения времени с помощью t.dt.dayofweek >= 5 чтобы выбрать только время, t.dt.dayofweek >= 5 на выходные, а затем группироваться по year * 100 + weekofyear стоимости, которая разная каждую неделю – здесь я использую year * 100 + weekofyear потому что результат выглядит как 201603 что довольно приятно читать для отладки.

Результирующая функция:

 def highlight_weekends(timeseries): dt = timeseries.dt ranges = timeseries[dt.dayofweek >= 5].groupby(dt.year * 100 + dt.weekofyear).agg(['min', 'max']) for i, tmin, tmax in ranges.itertuples(): ax.axvspan(tmin, tmax, facecolor='orange', edgecolor='none', alpha=0.1) 

Просто передайте ему временной ряд, который является вашей осью x , и он будет выделять выходные для вас!

Python - лучший язык программирования в мире.