重采样后如何索引或绘制日期时间,以便它们正确显示在条形图轴上?

How do I index or plot datetimes after resampling so they display on a bar plot axis correctly?

我想像其他两个绘图一样在日期时间显示我的第三个绘图 x 轴数据(参见 linked 图)。我对每个图表都使用了类似的方法,但对第三个数据集进行了重新采样,以在我的时间段内每小时在条形图中绘制降水量。当我最初尝试像前两个一样设置第三个绘图的日期格式时,x 轴标签消失或数据绘制不正确。在下面的 link 中,数据按照我想要的方式显示。

Three subplots of rainfall

我的时间序列数据是这样的,我只关心 'Reading' 和 'Value':

Reading,Receive,Value,Unit,Quality
2018-04-07 13:09:28,2018-04-07 13:09:35,0.00,in,A
2018-04-07 06:01:25,2018-04-07 06:01:35,0.04,in,A
2018-04-07 04:38:15,2018-04-07 04:38:35,0.04,in,A

以下是我如何在第二个图中实现正确的方案:

import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.patches as patches
import matplotlib.dates as mdates
import datetime as dt

#read data from csv
data2 = pd.read_csv('Arroyo_Corte_Madera_del_Presidio_38021_Precipitation_Accumulation_0.txt', usecols=['Reading','Value'], parse_dates=['Reading'])

#set date as index
data2.set_index('Reading',inplace=True)

#plot data
ax2 = plt.subplot(3, 1, 2)
data2.plot(ax=ax2)

#set ticks every 12 hours
ax2.xaxis.set_major_locator(mdates.HourLocator(byhour=range(0,24,12)))
plt.xticks(rotation=0, ha='center')

#format date
ax2.xaxis.set_major_formatter(mdates.DateFormatter('%b %d\n%H:%M:%S'))

ax2.legend().set_visible(False)
ax2.set_title('Accumulated Rainfall\nApril 5-7, 2018')
ax2.set_xlabel('')
ax2.set_ylabel('Inches Since Oct 1 2017')
ax2.set_ylim(17.5, 22)

arrow_date2 = mdates.datestr2num('04/07/2018 04:30:00')
start_date2 = mdates.datestr2num('04/07/2018 03:00:00')
end_date2 = mdates.datestr2num('04/07/2018 06:00:00')
text_date2 = mdates.datestr2num('04/07/2018 03:00:00')
ax2.axvspan(start_date2, end_date2, 0.86, 0.97, color='green', alpha=0.35)

ax2.annotate("Approximate time of\nSlope Failure", xy=(arrow_date2, 21.5), xycoords='data', xytext=(text_date2, 19), textcoords='data', arrowprops=dict(arrowstyle="->", connectionstyle="arc3"))

到目前为止我的第三个子图的代码:

#read data from csv
data =pd.read_csv('Arroyo_Corte_Madera_del_Presidio_38021_Precipitation_Increment_0.txt', usecols=['Reading','Value'], parse_dates=['Reading'])

#set date as index
data.set_index('Reading',inplace=True)
resamp = data.resample('1H').sum().reset_index()

#plot data
ax3 = plt.subplot(3, 1, 3)
resamp.plot(kind='bar',ax=ax3, x='Reading', y='Value', width=0.9)

#set ticks every other hour
plt.xticks(ha='center')
for label in ax3.xaxis.get_ticklabels()[::2]:
       label.set_visible(False)

ax3.legend().set_visible(False)
ax3.set_title('Rainfall in Hours\nApril 6-7, 2018')
ax3.set_xlabel('')
ax3.set_ylabel('Precipitation Increment (in)')

plt.show()

如何修改我的代码以使轴标签按照我希望的方式绘制?

我的代码显然是错误的。当我重新采样数据时,我重置了索引。这创建了一个新的索引列,它扰乱了我想要的 x 值 ('Reading')。此外,我不应该在 resamp.plot 中策划 'x'。此解决方案帮助:。这是更正后的代码:

#read data from csv
data = pd.read_csv('Arroyo_Corte_Madera_del_Presidio_38021_Precipitation_Increment_0.txt', usecols=['Reading','Value'], parse_dates=['Reading'])

#set date as index
data.set_index('Reading',inplace=True)
resamp = data.resample('1H').sum()   # changed here

#plot data
ax3 = plt.subplot(3, 1, 3)
resamp.plot(ax=ax3, y='Value', kind='bar', width=0.9) # changed here

ax3.set_xticklabels([dt.strftime('%b %d\n%H:%M:%S') for dt in resamp.index])
plt.xticks(rotation=0, ha='center')
for i, tick in enumerate(ax3.xaxis.get_major_ticks()):
     if (i % (4) != 0): # 4 hours 
         tick.set_visible(False)
ax3.legend().set_visible(False)
ax3.set_title('Rainfall in Hours\nApril 6-7, 2018')
ax3.set_xlabel('')
ax3.set_ylabel('Precipitation Increment (in)')
ax3.set_ylim(0.00, 0.40)

plt.show()