QCrad Limits for Irradiance Data#

Test for physical limits on GHI, DHI or DNI using the QCRad criteria.

Identifying and filtering out invalid irradiance data is a useful way to reduce noise during analysis. In this example, we use pvanalytics.quality.irradiance.check_irradiance_limits_qcrad() to test for physical limits on GHI, DHI or DNI using the QCRad criteria. For this example we will use data from the RMIS weather system located on the NREL campus in Colorado, USA.

import pvanalytics
from pvanalytics.quality.irradiance import check_irradiance_limits_qcrad
import pvlib
import matplotlib.pyplot as plt
import pandas as pd
import pathlib

First, read in data from the RMIS NREL system. This data set contains 5-minute right-aligned data. It includes POA, GHI, DNI, DHI, and GNI measurements.

pvanalytics_dir = pathlib.Path(pvanalytics.__file__).parent
rmis_file = pvanalytics_dir / 'data' / 'irradiance_RMIS_NREL.csv'
data = pd.read_csv(rmis_file, index_col=0, parse_dates=True)

Now generate solar zenith estimates for the location, based on the data’s time zone and site latitude-longitude coordinates. This is done using the pvlib.solarposition.get_solarposition() function.

Generate the estimated extraterrestrial radiation for the time series, referred to as dni_extra. This is done using the pvlib.irradiance.get_extra_radiation() function.

Use pvanalytics.quality.irradiance.check_irradiance_limits_qcrad() to generate the QCRAD irradiance limit mask

qcrad_limit_mask = check_irradiance_limits_qcrad(
    solar_zenith=solar_position['zenith'],
    dni_extra=dni_extra,
    ghi=data['irradiance_ghi__7981'],
    dhi=data['irradiance_dhi__7983'],
    dni=data['irradiance_dni__7982'])

Plot the ‘irradiance_ghi__7981’ data stream with its associated QCRAD limit mask.

data['irradiance_ghi__7981'].plot()
data.loc[qcrad_limit_mask[0], 'irradiance_ghi__7981'].plot(ls='', marker='.')
plt.legend(labels=["RMIS GHI", "Within QCRAD Limits"],
           loc="upper left")
plt.xlabel("Date")
plt.ylabel("GHI (W/m^2)")
plt.tight_layout()
plt.show()
qcrad limits irradiance

Plot the ‘irradiance_dhi__7983 data stream with its associated QCRAD limit mask.

data['irradiance_dhi__7983'].plot()
data.loc[qcrad_limit_mask[1], 'irradiance_dhi__7983'].plot(ls='', marker='.')
plt.legend(labels=["RMIS DHI", "Within QCRAD Limits"],
           loc="upper left")
plt.xlabel("Date")
plt.ylabel("DHI (W/m^2)")
plt.tight_layout()
plt.show()
qcrad limits irradiance

Plot the ‘irradiance_dni__7982’ data stream with its associated QCRAD limit mask.

data['irradiance_dni__7982'].plot()
data.loc[qcrad_limit_mask[2], 'irradiance_dni__7982'].plot(ls='', marker='.')
plt.legend(labels=["RMIS DNI", "Within QCRAD Limits"],
           loc="upper left")
plt.xlabel("Date")
plt.ylabel("DNI (W/m^2)")
plt.tight_layout()
plt.show()
qcrad limits irradiance

Total running time of the script: (0 minutes 0.752 seconds)

Gallery generated by Sphinx-Gallery