diff --git a/docs/sphinx/source/whatsnew/v0.15.2.rst b/docs/sphinx/source/whatsnew/v0.15.2.rst index 37f8692280..ac56307b23 100644 --- a/docs/sphinx/source/whatsnew/v0.15.2.rst +++ b/docs/sphinx/source/whatsnew/v0.15.2.rst @@ -14,6 +14,9 @@ Deprecations Bug fixes ~~~~~~~~~ +* Added test coverage for :py:func:`pvlib.irradiance.dirint` with + ``np.array`` and ``pd.Series`` inputs. + (:issue:`2751`, :pull:`2752`) * Corrects a bug in :py:func:`pvlib.temperature.fuentes`. If inputs were data type integer, users can expect modeled cell temperature values to increase slightly. diff --git a/pvlib/irradiance.py b/pvlib/irradiance.py index 5a4a76df25..5f4a28cb2f 100644 --- a/pvlib/irradiance.py +++ b/pvlib/irradiance.py @@ -1964,9 +1964,9 @@ def dirint(ghi, solar_zenith, times, pressure=101325., use_delta_kt_prime=True, Returns ------- - dni : array-like - The modeled direct normal irradiance, as provided by the - DIRINT model. [Wm⁻²] + dni : pd.Series + Estimated direct normal irradiance. Returns float if all inputs + are scalar, pd.Series otherwise. [Wm⁻²] Notes ----- @@ -2109,6 +2109,10 @@ def _dirint_bins(times, kt_prime, zenith, w, delta_kt_prime): ------- tuple of kt_prime_bin, zenith_bin, w_bin, delta_kt_prime_bin """ + # Ensure scalar inputs are converted to Series so that boolean masks + # produce a boolean Series rather than a scalar bool. + # Scalar bools cause KeyError in pandas >= 2.0. GH #XXXX + # @wholmgren: the following bin assignments use MATLAB's 1-indexing. # Later, we'll subtract 1 to conform to Python's 0-indexing. diff --git a/tests/test_irradiance.py b/tests/test_irradiance.py index a416636ae9..8654443722 100644 --- a/tests/test_irradiance.py +++ b/tests/test_irradiance.py @@ -1140,6 +1140,31 @@ def test_dirindex_min_cos_zenith_max_zenith(): assert_series_equal(out, expected) +def test_dirint_array_inputs(): + """np.array inputs work correctly. GH #2751""" + times = pd.DatetimeIndex(['2023-06-21 12:00'], tz='UTC') + + # np.array input (1-element) -- return pd.Series + result = irradiance.dirint( + ghi=np.array([500.0]), + solar_zenith=np.array([45.0]), + times=times, + use_delta_kt_prime=False + ) + assert isinstance(result, pd.Series) + assert result.iloc[0] > 0 + + # pd.Series input -- return pd.Series + times2 = pd.date_range('2023-06-21 10:00', periods=3, freq='h', tz='UTC') + result2 = irradiance.dirint( + ghi=pd.Series([400, 500, 300], index=times2), + solar_zenith=pd.Series([50, 40, 60], index=times2), + times=times2 + ) + assert isinstance(result2, pd.Series) + assert (result2 >= 0).all() + + def test_dni(): ghi = pd.Series([90, 100, 100, 100, 100]) dhi = pd.Series([100, 90, 50, 50, 50])