Skip to content
3 changes: 3 additions & 0 deletions docs/sphinx/source/whatsnew/v0.15.2.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
10 changes: 7 additions & 3 deletions pvlib/irradiance.py
Original file line number Diff line number Diff line change
Expand Up @@ -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⁻²]
Comment thread
Omesh37 marked this conversation as resolved.
Outdated

Notes
-----
Expand Down Expand Up @@ -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
Comment thread
Omesh37 marked this conversation as resolved.
Outdated
Comment thread
Omesh37 marked this conversation as resolved.
Outdated

# @wholmgren: the following bin assignments use MATLAB's 1-indexing.
# Later, we'll subtract 1 to conform to Python's 0-indexing.

Expand Down
25 changes: 25 additions & 0 deletions tests/test_irradiance.py
Original file line number Diff line number Diff line change
Expand Up @@ -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])
Expand Down
Loading