Непоследовательная автоматическая маркировка даты панд

1

Мне было интересно, как pandas форматирует дату оси X точно. Я использую один и тот же сценарий для набора результатов данных, которые имеют одинаковый формат pandas df. Тем не менее, панды форматируют каждую дату df по-разному. Как это может быть более последовательно?

Каждый df имеет такой DatetimeIndex как этот, dtype='datetime64[ns]

>>> df.index
DatetimeIndex(['2014-10-02', '2014-10-03', '2014-10-04', '2014-10-05',
               '2014-10-06', '2014-10-07', '2014-10-08', '2014-10-09',
               '2014-10-10', '2014-10-11',
               ...
               '2015-09-23', '2015-09-24', '2015-09-25', '2015-09-26',
               '2015-09-27', '2015-09-28', '2015-09-29', '2015-09-30',
               '2015-10-01', '2015-10-02'],
              dtype='datetime64[ns]', name='Date', length=366, freq=None)

В конце концов, я df.plot() график с помощью df.plot() где у df есть два столбца. Но оси графиков имеют разные стили, например:

Изображение 174551

Изображение 174551

Я хотел бы, чтобы все графики имели стиль оси X первого графика. Панды должны делать это автоматически, поэтому я бы предпочел не начинать с форматирования xticks, так как у меня достаточно данных для печати. Кто-нибудь может объяснить, что делать? Спасибо!

РЕДАКТИРОВАТЬ:

Я читаю два csv файла с 2015 года. У первого есть результаты модели около 200 станций, у второго - измерения по тем же станциям. Позже я прочитал еще два csv файла 2016 года в том же формате.

import pandas as pd

df_model = pd.read_csv(path_model, sep=';', index_col=0, parse_dates=True)
df_gauge = pd.read_csv(path_gauge, sep=';', index_col=0, parse_dates=True)

df = pd.DataFrame(columns=['model', 'gauge'], index=df_model.index)

df['model'] = df_model['station_1'].copy()
df['gauge'] = df_gauge['station_1'].copy()

df.plot()

Я делаю это каждый год, поэтому ось X должна выглядеть одинаково, верно?

  • 0
    Не могли бы вы добавить код, который возвращает plot
Теги:
pandas
date-format
plot
axes

1 ответ

0

Я не думаю, что это возможно, если вы не внесете изменения в библиотеку панд. Я немного осмотрелся, чтобы найти варианты, которые можно установить в Пандах, но не смог найти. Панда пытается разумно выбрать тип отметок оси, используя логику, реализованную здесь (я ДУМАЮ). Так что, по моему мнению, было бы лучше определить свою собственную функцию для создания графиков, а затем переписать форматирование тиков (хотя вы не хотите этого делать).

Есть много ссылок в Интернете, которые показывают, как это сделать. Я использовал этот вопрос от "Simone Centellegher" и этот ответ от stackoverflow, чтобы придумать функцию, которая может работать для вас (протестировано в python 3.7.1 с matplotlib 3.0.2, pandas 0.23.4):

import pandas as pd
import numpy as np
import matplotlib.dates as mdates
import matplotlib.pyplot as plt

## pass df with columns you want to plot
def my_plotter(df, xaxis, y_cols):
    fig, ax = plt.subplots()
    plt.plot(xaxis,df[y_cols])

    ax.xaxis.set_minor_locator(mdates.MonthLocator())
    ax.xaxis.set_major_locator(mdates.YearLocator())

    ax.xaxis.set_minor_formatter(mdates.DateFormatter('%b'))
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%b\n%Y'))

    # Remove overlapping major and minor ticks
    majticklocs = ax.xaxis.get_majorticklocs()
    minticklocs = ax.xaxis.get_minorticklocs()
    minticks = ax.xaxis.get_minor_ticks()

    for i in range(len(minticks)):
        cur_mintickloc = minticklocs[i]
        if cur_mintickloc in majticklocs:
            minticks[i].set_visible(False)

    return fig, ax


df = pd.DataFrame({'values':np.random.randint(0,1000,36)}, \
                index=pd.date_range(start='2014-01-01', \
                                end='2016-12-31',freq='M'))

fig, ax = my_plotter(df, df.index, ["values"])
  • 0
    Хорошо, большое спасибо! Я посмотрю на это. Я боялся, что мне придется делать это вручную, но это должно быть хорошо, если это относится ко всем фигурам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню