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)
这给了我:
Pat*_*ald 10
您可以使用时间戳的日期时间属性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)
| 归档时间: |
|
| 查看次数: |
16430 次 |
| 最近记录: |