我想知道pandas是如何准确地格式化x轴日期的。我在一堆数据结果上使用相同的脚本,它们都具有相同的pandas df格式。但是,pandas格式化每个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有两列。但是这些图的轴有不同的样式,如下所示:
我希望所有绘图都具有第一个绘图的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轴应该看起来一样,对吗?
除非你对pandas库进行修改,否则我认为这不可行。我环顾了一下可能在Pandas中设置的选项,但找不到一个。 Pandas尝试使用逻辑实现的here(I THINK)智能地选择轴刻度的类型。所以在我看来,最好定义自己的函数来制作图,而不是覆盖刻度格式(尽管你不想这样做)。
互联网上有很多参考资料,展示了如何做到这一点。我使用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"])