Skip to content
41 changes: 41 additions & 0 deletions pvlib/location.py
Original file line number Diff line number Diff line change
Expand Up @@ -276,3 +276,44 @@ def get_airmass(self, times=None, solar_position=None,
airmass['airmass_absolute'] = airmass_absolute

return airmass

def get_sun_rise_set_transit(self, times, method='pyephem', **kwargs):
"""
Calculate sunrise, sunset and transit times.

Parameters
----------
times : DatetimeIndex
Must be localized to the Location
method : str, default 'pyephem'
'pyephem', 'spa', or 'geometric'

kwargs are passed to the relevant functions. See
solarposition.sun_rise_set_transit_<method> for details.

Returns
-------
result : DataFrame
Column names are: ``sunrise, sunset, transit``.
"""

if method == 'pyephem':
result = solarposition.sun_rise_set_transit_ephem(times,
self.latitude,
self.longitude,
**kwargs)
elif method == 'spa':
result = solarposition.sun_rise_set_transit_spa(times,
self.latitude,
self.longitude,
**kwargs)
elif method == 'geometric':
result = solarposition.sun_rise_set_transit_geometric(times,
self.latitude,
self.longitude,
**kwargs)
else:
raise ValueError('{} is not a valid method. Must be '
'one of pyephem, spa, geometric'
.format(method))
return result
24 changes: 23 additions & 1 deletion pvlib/test/test_location.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@

import pvlib
from pvlib.location import Location

from pvlib.solarposition import declination_spencer71
from pvlib.solarposition import equation_of_time_spencer71
from test_solarposition import expected_solpos, golden_mst
from test_solarposition import golden, expected_rise_set_ephem

from conftest import requires_scipy

Expand Down Expand Up @@ -311,3 +313,23 @@ def test_Location___repr__():
' tz: US/Arizona'
])
assert tus.__repr__() == expected


def test_get_sun_rise_set_transit(golden):
times = pd.DatetimeIndex(['2015-01-01 07:00:00', '2015-01-01 23:00:00'],
tz='MST')
result = golden.get_sun_rise_set_transit(times, method='pyephem')
assert all(result.columns == ['sunrise', 'sunset', 'transit'])

result = golden.get_sun_rise_set_transit(times, method='spa')
assert all(result.columns == ['sunrise', 'sunset', 'transit'])

dayofyear = 1
declination = declination_spencer71(dayofyear)
eot = equation_of_time_spencer71(dayofyear)
(sr, ss, tr) = golden.get_sun_rise_set_transit(times, method='geometric',
declination=declination,
equation_of_time=eot)
assert all(isinstance(sr, pd.DatetimeIndex),
isinstance(ss, pd.DatetimeIndex),
isinstance(tr, pd.DatetimeIndex))