CHECK_DHI_QCRAD

This function tests for lower and upper limits on Diffuse Horizontal Irradiance (DHI) using the QCRad criteria.

The test is applied to each DHI value. A reading passes if it is strictly greater than the lower bound and less than the upper bound. The bounds can be either ‘physical’ or ‘extreme’ criteria.

Excel Usage

=CHECK_DHI_QCRAD(dhi, solar_zenith, dni_extra, limits)
  • dhi (list[list], required): Diffuse horizontal irradiance (W/m^2).
  • solar_zenith (list[list], required): Solar zenith angle (degrees).
  • dni_extra (list[list], required): Extraterrestrial normal irradiance (W/m^2).
  • limits (str, optional, default: “physical”): QCRAD QC limits.

Returns (list[list]): 2D list of booleans (True if passed limits), or an error string.

Example 1: Check DHI physical limits pass and fail cases

Inputs:

dhi solar_zenith dni_extra limits
100 30 1367 physical
-10 30 1367
1500 30 1367

Excel formula:

=CHECK_DHI_QCRAD({100;-10;1500}, {30;30;30}, {1367;1367;1367}, "physical")

Expected output:

Result
true
false
false
Example 2: Evaluate DHI values with extreme limits setting

Inputs:

dhi solar_zenith dni_extra limits
80 20 1367 extreme
400 45 1367
1100 60 1367

Excel formula:

=CHECK_DHI_QCRAD({80;400;1100}, {20;45;60}, {1367;1367;1367}, "extreme")

Expected output:

Result
true
true
false
Example 3: Handle scalar inputs as single observations

Inputs:

dhi solar_zenith dni_extra limits
200 35 1367 physical

Excel formula:

=CHECK_DHI_QCRAD(200, 35, 1367, "physical")

Expected output:

true

Example 4: Process a row vector of DHI observations

Inputs:

dhi solar_zenith dni_extra limits
50 150 300 10 30 50 1367 1367 1367 physical

Excel formula:

=CHECK_DHI_QCRAD({50,150,300}, {10,30,50}, {1367,1367,1367}, "physical")

Expected output:

Result
true
true
true

Python Code

Show Code
import pandas as pd
from pvanalytics.quality.irradiance import check_dhi_limits_qcrad as result_func

def check_dhi_qcrad(dhi, solar_zenith, dni_extra, limits='physical'):
    """
    Return a pass/fail QC flag array for each DHI reading against QCRad physical or extreme limits.

    See: https://pvanalytics.readthedocs.io/en/stable/generated/pvanalytics.quality.irradiance.check_dhi_limits_qcrad.html

    This example function is provided as-is without any representation of accuracy.

    Args:
        dhi (list[list]): Diffuse horizontal irradiance (W/m^2).
        solar_zenith (list[list]): Solar zenith angle (degrees).
        dni_extra (list[list]): Extraterrestrial normal irradiance (W/m^2).
        limits (str, optional): QCRAD QC limits. Valid options: Physical, Extreme. Default is 'physical'.

    Returns:
        list[list]: 2D list of booleans (True if passed limits), or an error string.
    """
    try:
        def flatten(data):
            if not isinstance(data, list):
                return [float(data)]
            flat = []
            for row in data:
                if isinstance(row, list):
                    for val in row:
                        if val != "":
                            flat.append(float(val))
                elif row != "":
                    flat.append(float(row))
            return flat

        dhi_s = pd.Series(flatten(dhi))
        zenith_s = pd.Series(flatten(solar_zenith))
        dni_extra_s = pd.Series(flatten(dni_extra))

        n = len(dhi_s)
        if not (len(zenith_s) == n and len(dni_extra_s) == n):
            return "Error: All input arrays must have the same length"
        if n == 0:
            return "Error: Arrays cannot be empty"

        lim = str(limits) if limits is not None else "physical"
        if lim not in ["physical", "extreme"]:
            return "Error: limits must be either 'physical' or 'extreme'"

        res = result_func(dhi_s, zenith_s, dni_extra_s, limits=lim)

        return [[bool(v)] for v in res]
    except Exception as e:
        return f"Error: {str(e)}"

Online Calculator

Diffuse horizontal irradiance (W/m^2).
Solar zenith angle (degrees).
Extraterrestrial normal irradiance (W/m^2).
QCRAD QC limits.