End-of-year “roll-over”
End-of-year “roll-over”#
Single-year datasets retrieved from the PSM3 API with utc=false have a quirk where the last few hours in the dataset are technically from the prior year.
I guess the reason is due to a process roughly as follows:
The API grabs a calendar year of data in UTC
The API converts to local time, thereby shifting a few January hours into the previous December
The API takes those few hours in the previous year and puts them at the end of the dataset, thereby creating a complete calendar year again
In any case, it can create some minor inconsistencies in the last N hours of the dataset, where N is the location’s UTC offset. This notebook shows how it introduces discontinuities in temperature and humidity. The Solar Position notebook shows how it affects the solar position calculation.
[3]: import pvlib import pandas as pd import numpy as np lat, lon = 40, -120 # note: get_psm3() specifies utc=false internally. # nothing special about this place and time, other than the discontinuities # being visually obvious. df, meta = pvlib.iotools.get_psm3(lat, lon, 'DEMO_KEY', 'assessingsolar@gmail.com', names=2018, interval=5, map_variables=True, leap_day=True, attributes=['air_temperature', 'surface_pressure', 'total_precipitable_water', 'relative_humidity']) # drop nuisance cols, only keep the ones we want: df = df[['temp_air', 'pressure', 'precipitable_water', 'relative_humidity']]
Taking a look at the last few hours of the year, notice the discontinuities:
[4]: axes = df.loc['2018-12-29':].plot(subplots=True) boundary = df.index[-1] + df.index[-1].utcoffset() for ax in axes: ax.axvline(boundary, ls=':', c='k')
Now, let’s move those last few hours back to the beginning where they originally came from. See how nicely it joins up with the rest of the data?
[5]: df_shift = df.copy() df_shift.index = np.where(df_shift.index > boundary, df_shift.index - pd.DateOffset(years=1), df_shift.index) df_shift = df_shift.sort_index() axes = df_shift.loc[:'2018-01-02'].plot(subplots=True) for ax in axes: ax.axvline(df.index[0], ls=':', c='k')
[6]: %load_ext watermark %watermark --iversions -u -d -t Last updated: 2022-09-21 18:07:13 numpy : 1.22.3 pandas: 1.5.0 pvlib : 0.9.3 [ ]: