def sun_rise_set_transit_spa(times, latitude, longitude, how='<STR_LIT>',<EOL>delta_t=<NUM_LIT>, numthreads=<NUM_LIT:4>):
<EOL>lat = latitude<EOL>lon = longitude<EOL>if times.tz:<EOL><INDENT>tzinfo = times.tz<EOL><DEDENT>else:<EOL><INDENT>raise ValueError('<STR_LIT>')<EOL><DEDENT>utcday = pd.DatetimeIndex(times.date).tz_localize('<STR_LIT>')<EOL>unixtime = np.array(utcday.astype(np.int64)/<NUM_LIT:10>**<NUM_LIT:9>)<EOL>spa = _spa_python_import(how)<EOL>delta_t = delta_t or spa.calculate_deltat(times.year, times.month)<EOL>transit, sunrise, sunset = spa.transit_sunrise_sunset(<EOL>unixtime, lat, lon, delta_t, numthreads)<EOL>transit = pd.to_datetime(transit*<NUM_LIT>, unit='<STR_LIT>', utc=True).tz_convert(<EOL>tzinfo).tolist()<EOL>sunrise = pd.to_datetime(sunrise*<NUM_LIT>, unit='<STR_LIT>', utc=True).tz_convert(<EOL>tzinfo).tolist()<EOL>sunset = pd.to_datetime(sunset*<NUM_LIT>, unit='<STR_LIT>', utc=True).tz_convert(<EOL>tzinfo).tolist()<EOL>return pd.DataFrame(index=times, data={'<STR_LIT>': sunrise,<EOL>'<STR_LIT>': sunset,<EOL>'<STR_LIT>': transit})<EOL>
Calculate the sunrise, sunset, and sun transit times using the
NREL SPA algorithm described in [1].

If numba is installed, the functions can be compiled to
machine code and the function can be multithreaded.
Without numba, the function evaluates via numpy with
a slight performance hit.

Parameters
----------
times : pandas.DatetimeIndex
    Must be localized to the timezone for ``latitude`` and ``longitude``.
latitude : float
    Latitude in degrees, positive north of equator, negative to south
longitude : float
    Longitude in degrees, positive east of prime meridian, negative to west
delta_t : float, optional
    If delta_t is None, uses spa.calculate_deltat
    using times.year and times.month from pandas.DatetimeIndex.
    For most simulations specifing delta_t is sufficient.
    Difference between terrestrial time and UT1.
    delta_t = None will break code using nrel_numba,
    this will be fixed in a future version.
    By default, use USNO historical data and predictions
how : str, optional, default 'numpy'
    Options are 'numpy' or 'numba'. If numba >= 0.17.0
    is installed, how='numba' will compile the spa functions
    to machine code and run them multithreaded.
numthreads : int, optional, default 4
    Number of threads to use if how == 'numba'.

Returns
-------
pandas.DataFrame
    index is the same as input `times` argument
    columns are 'sunrise', 'sunset', and 'transit'

References
----------
[1] Reda, I., Andreas, A., 2003. Solar position algorithm for solar
radiation applications. Technical report: NREL/TP-560- 34302. Golden,
USA, http://www.nrel.gov.