Как индексировать или отображать дату и время после повторной выборки, чтобы они правильно отображались на оси гистограммы?

Я хочу отобразить данные оси X моего третьего графика в дате и времени, как мои два других графика (см. связанный рисунок). Я использовал аналогичные подходы к каждому графику, но передискретизировал третий набор данных, чтобы отобразить осадки в виде гистограммы для каждого часа в течение моего периода времени. Когда я первоначально попытался отформатировать дату для третьего графика, как я сделал в предыдущих двух, метки оси x либо исчезли, либо данные отображаются неправильно. В приведенной ниже ссылке данные отображаются так, как я задумал.

Три графика осадков

Мои данные временных рядов выглядят так, где меня интересуют только «Чтение» и «Значение»:

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()

Как исправить мой код, чтобы метки осей отображались так, как я хочу?


person JR Lindeman    schedule 02.07.2018    source источник


Ответы (1)


Мой код был неправильным, очевидно. Когда я передискретизировал данные, я сбрасывал индекс. Это создало новый столбец индекса, который искажал мои желаемые значения x («Чтение»). Кроме того, я не должен был отображать «x» в resamp.plot. Это решение помогло: Чертеж с пандами. Вот исправленный код:

#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()
person JR Lindeman    schedule 03.07.2018