This is the temperature for the Yatir Forest (Shani station, see map), between 2 and 5 of January 2022. Data is in intervals of 10 minutes, and was downloaded from the Israel Meteorological Service.
import stuff
import numpy as npimport matplotlib.pyplot as pltimport pandas as pdfrom matplotlib.dates import DateFormatterimport matplotlib.dates as mdatesimport matplotlib.ticker as tickerimport seaborn as snssns.set(style="ticks", font_scale=1.5) # white graphs, with large and legible letters# %matplotlib widget
# dirty trick to have dates in the middle of the 24-hour period# make minor ticks in the middle, put the labels there!# from https://matplotlib.org/stable/gallery/ticks/centered_ticklabels.htmldef centered_dates(ax): date_form = DateFormatter("%d %b") # %d 3-letter-Month# major ticks at midnight, every day ax.xaxis.set_major_locator(mdates.DayLocator(interval=1)) ax.xaxis.set_major_formatter(date_form)# minor ticks at noon, every day ax.xaxis.set_minor_locator(mdates.HourLocator(byhour=[12]))# erase major tick labels ax.xaxis.set_major_formatter(ticker.NullFormatter())# set minor tick labels as define above ax.xaxis.set_minor_formatter(date_form)# completely erase minor ticks, center tick labelsfor tick in ax.xaxis.get_minor_ticks(): tick.tick1line.set_markersize(0) tick.tick2line.set_markersize(0) tick.label1.set_horizontalalignment('center')
We see that the temperature curve has a rough profile. Can we find ways of getting smoother curves?
We learned how to average over a window with resample. Let’s try that for a 2-hour window:
plot with 2-hour resampled average
df_2h = df['TD'].resample('2h').mean()# resample labels each window with its beginning, we move the points to the middle of the windowdf_2h.index = df_2h.index + pd.Timedelta(hours=1)fig, ax = plt.subplots(figsize=(8,5))ax.plot(df['TD'], color='black')ax.plot(df_2h, color='xkcd:hot pink', ls='-', marker="o", mfc="None")ax.set(ylim=[5, 17.5], xlim=[df.index[0], df.index[-1]], ylabel="Temperature (°C)", title="Yatir Forest, 2022", yticks=[5,10,15])centered_dates(ax)
The temperature profile now is much smoother, but when using resample, we lost temporal resolution. Our original data had 10-minute frequency, and now we have a 2-hour frequency.
How can we get a smoother curve without losing resolution?