首页 > 解决方案 > DateFormatter pandas 在重新采样 DF Hourly 后绘制错误的日期

问题描述

我正在尝试每小时重新采样我的 df 并绘制数据。但是,当我每小时重新采样时 DateFormatter 正在绘制错误的日期和错误的间隔。

如果我每天重新采样数据,它就可以正常工作。任何想法如何解决这个问题。您可以在下面找到我正在使用的代码。

重采样在第 23 行。从“D”更改为“H”以测试代码。安装库: pip install seebuoy

太感谢了。

from seebuoy import ndbc
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.dates import DateFormatter
from matplotlib.ticker import AutoMinorLocator

buoy = 46235

title = 'Imperial Beach Nearshore (21 m)\nStation 46235'#- Maximun Daily' '
begin = '2020-09-01 00:00' # Begin of data set  YYYY/MM/DD
end = '2021-03-31 00:00' # end of data set  YYYY/MM/DD

years = ndbc.available_years(buoy, "stdmet")
df_store = []
for year in years[-3:]:
  df_store.append(ndbc.historic(buoy, year, dataset="stdmet"))

df = pd.concat(df_store)

df = df[(df.index > begin) & (df.index <= end)]

df=df.resample('H').agg(dict(wvht='max', dpd='mean', apd='median', mwd='mean'))

# Ploting dataset
fig,ax = plt.subplots(3, sharex=True, figsize=(10,8))
df.wvht.plot(ax=ax[0], color=['black'], linewidth=1)

ax[0].set_yticks([0,1,2, 3, 4, 5, 6])
ax[0].set_ylabel('Wave Hs, m', fontsize=9)
ax[0].tick_params(axis='y', labelsize=9)
ax[0].yaxis.set_minor_locator(AutoMinorLocator(2))

df.apd.plot(ax=ax[1], color=['black'], linewidth=1)
# df2.Ta.plot(ax=ax[1], color=['red'], linewidth=1)
ax[1].set_ylabel('Period, sec',fontsize=9)
ax[1].set_ylim(1,16)
ax[1].set_yticks([0,4,8,12,16])
ax[1].tick_params(axis='y', labelsize=9)
ax[1].yaxis.set_minor_locator(AutoMinorLocator(2))

df.mwd.plot(ax=ax[2], color=['black'], linewidth=1)
ax[2].set_ylabel('Wave Direction',fontsize=9)
ax[2].set_ylim(0,360)
ax[2].set_yticks(([0,90,180,270, 360]))
ax[2].tick_params(axis='y', labelsize=9)
ax[2].xaxis.set_minor_locator(AutoMinorLocator(3))
ax[2].yaxis.set_minor_locator(AutoMinorLocator(2))


date_form = DateFormatter('%d%b\n%Y')
ax[2].xaxis.set_major_formatter(date_form)
# ax[2].xaxis.set_major_locator(mdates.DayLocator(interval=15))
# ax[2].xaxis.set_major_locator(mdates.HourLocator(interval=12))
ax[2].xaxis.set_major_locator(mdates.MonthLocator(interval=1))
# ax[2].xaxis.set_major_locator(mdates.YearLocator(1))

ax[2].tick_params(axis='x', labelsize=9, rotation=0)
for tick in ax[2].xaxis.get_majorticklabels():
          tick.set_horizontalalignment("center")

标签: pythondateformatterpandas-resample

解决方案


推荐阅读