用于轴标签的Matplotlib DateFormatter不起作用

Spi*_*uce 15 python date matplotlib pandas

我正在尝试调整x轴日期刻度标签的格式,以便它只显示年份和月份值.从我在网上找到的,我必须使用mdates.DateFormatter,但它现在的代码根本没有生效.有谁知道问题出在哪里?(日期是大熊猫Dataframe的索引)

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

fig = plt.figure(figsize = (10,6))
ax = fig.add_subplot(111)

ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))

basicDF['some_column'].plot(ax=ax, kind='bar', rot=75)

ax.xaxis_date()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

可重现的场景代码:

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

rng = pd.date_range('1/1/2014', periods=20, freq='m')

blah = pd.DataFrame(data = np.random.randn(len(rng)), index=rng)

fig = plt.figure(figsize = (10,6))
ax = fig.add_subplot(111)

ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))

blah.plot(ax=ax, kind='bar')

ax.xaxis_date()
Run Code Online (Sandbox Code Playgroud)

仍然不能只是出现年和月.

如果我在.plot之后设置格式,会得到如下错误:

ValueError:DateFormatter发现值为x = 0,这是一个非法日期.这通常是因为您没有告知轴它正在绘制日期,例如,用a x.xaxis_date().

如果我把它放在ax.xaxis_date()之前或之后,它也是一样的.

Pau*_*l H 16

大熊猫不适用于自定义日期时间格式.

你需要在这种情况下使用原始的matplotlib.

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

N = 20
numpy.random.seed(N)

dates = pandas.date_range('1/1/2014', periods=N, freq='m')
df = pandas.DataFrame(
    data=numpy.random.randn(N), 
    index=dates,
    columns=['A']
)

fig, ax = plt.subplots(figsize=(10, 6))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
ax.bar(df.index, df['A'], width=25, align='center')
Run Code Online (Sandbox Code Playgroud)

这给了我:

在此输入图像描述

  • 2020年还是这样吗? (2认同)

Pat*_*ald 10

仅使用 pandas 的解决方案

您可以使用时间戳的日期时间属性DatetimeIndex来创建格式良好的刻度。对于这样的情况,不需要刻度定位器和格式化程序,除非您在使用 matplotlib 的交互式界面进行放大和缩小时需要动态刻度(与比本例中更长的时间范围更相关)。matplotlib.dates

import numpy as np   # v 1.19.2
import pandas as pd  # v 1.1.3

# Create sample time series with month start frequency, plot it with a pandas bar chart
rng = np.random.default_rng(seed=1) # random number generator
dti = pd.date_range('1/1/2014', periods=20, freq='m')
df = pd.DataFrame(data=rng.normal(size=dti.size), index=dti)
ax = df.plot.bar(figsize=(10,4), legend=None)

# Set major ticks and tick labels
ax.set_xticks(range(df.index.size))
ax.set_xticklabels([ts.strftime('%b\n%Y') if ts.year != df.index[idx-1].year
                    else ts.strftime('%b') for idx, ts in enumerate(df.index)])
ax.figure.autofmt_xdate(rotation=0, ha='center');
Run Code Online (Sandbox Code Playgroud)

pd_bar_chart_date_ticks