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) 

  • Создание манекена в конвейере с различными уровнями в поезде и тестовом наборе
  • фильтрация кадров данных pandas по датам
  • pandas - чтение нескольких записей JSON в dataframe
  • У iterrows проблемы с производительностью?
  • кадр данных tfidf с помощью python
  • Панды, как применять несколько функций к кадру данных
  • Что означает значение ValueError: невозможно переиндексировать из дублированной оси?
  • Создание отдельного объекта Counter () и Pandas DataFrame для каждого списка в списке списков
  • 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 - лучший язык программирования в мире.