熊猫/ matplotlib显示2018年和2019年分别为48和49

时间:2018-06-29 22:06:00

标签: python pandas matplotlib

我正在使用Pandas在单个图表中绘制具有两个时间序列的数据框。但是,年份信息出来的数字很奇怪。 x轴分别是2018年和2019年,分别为48年和49年。例如,日期05-01-2018变为05-01-48。参见此问题底部的图。

我的问题类似于this question,但是解决该问题的方法是使用matplotlib的plot()而不是Pandas的df.plot()函数。我更喜欢使用df.plot(),因为它可以轻松地绘制两个时间序列。

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

from matplotlib.dates import MonthLocator, DateFormatter

indx = pd.date_range('2017-04-01', '2019-01-01')
seriesA = pd.Series(np.random.randn(len(indx)), index=indx)
seriesB = pd.Series(np.random.randn(len(indx)), index=indx)
df = pd.DataFrame({'a': seriesA, 'b': seriesB})

df.head()
#                    a         b
# 2017-04-01 -1.191265 -0.268962
# 2017-04-02  1.545406 -0.805481
# 2017-04-03  0.022768 -1.412308
# 2017-04-04 -2.024388  0.268758
# 2017-04-05  0.900840 -1.654095

ax = df.plot(y=['a', 'b'], figsize=(12,7))

xtick_locator = MonthLocator(interval=1)
xtick_dateformatter = DateFormatter('%m/%d/%Y')
ax.xaxis.set_major_locator(xtick_locator)
ax.xaxis.set_major_formatter(xtick_dateformatter)
ax.autoscale_view()
_ = plt.xticks(rotation=90, )
_ = plt.grid()
_ = plt.xlabel('')
_ = plt.ylim(0)

_ = plt.show()

enter image description here

1 个答案:

答案 0 :(得分:1)

考虑使用plt.FixedFormatter从大熊猫resample那里获取每月的日期。以下使用从2017年开始发布的数据。

# RESAMPLE SERIES (TAKING INDEX VALUES)
x_dates = pd.Series(df.resample('MS').max().index).dt.strftime('%m/%d/%Y')
# ASSIGN AS AXIS TICKS
ax.xaxis.set_major_formatter(plt.FixedFormatter(x_dates))
ax.set_xticklabels(labels=x_dates, rotation=45, ha='center')

xtick_locator = MonthLocator(interval=1)    
ax.xaxis.set_major_locator(xtick_locator)

plt.autoscale(enable=True, axis='x', tight=True)

ax.autoscale_view()
_ = plt.xticks(rotation=90, ha='center')
_ = plt.grid()
_ = plt.xlabel('')
_ = plt.ylim(0)
_ = plt.show()

Time Series Plot Output