熊猫自动标注日期不一致

时间:2019-04-15 08:29:02

标签: python pandas plot date-format axes

我想知道熊猫如何精确地格式化x轴日期。我在一堆数据结果上使用了相同的脚本,这些结果都具有相同的pandas df格式。但是,熊猫对每个df日期的格式不同。怎么会更一致?

每个df都有一个DatetimeIndexdtype='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有两列。 但是图的轴具有不同的样式,如下所示:

enter image description here

enter image description here

我希望所有图都具有第一个图的x轴样式。熊猫应该自动执行此操作,因此我不希望从xticks格式开始,因为我要绘制很多数据。谁能解释该怎么办?谢谢!

编辑:

我正在读取2015年以来的两个csv文件。第一个具有大约200个测站的模型结果,第二个具有相同测站的仪表测量值。后来,我从2016年读取了另外两个具有相同格式的csv文件。

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轴应该看起来一样,对吧?

1 个答案:

答案 0 :(得分:0)

除非您对熊猫库进行了修改,否则我不会认为。我四处寻找了可能在Pandas中设置的选项,但找不到。熊猫尝试使用实现的here我认为)来智能地选择轴刻度的类型。因此,我认为,最好是定义自己的函数来绘制图表,而不是覆盖刻度线格式(尽管您不想这样做)。

互联网上有许多参考资料显示了如何执行此操作。我使用了this和“ Simone Centellegher”中的一个,以及this 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"])