@@ -139,7 +139,7 @@ def test_spa_python_numpy_physical_dst(expected_solpos, golden):
139139 assert_frame_equal (expected_solpos , ephem_data [expected_solpos .columns ])
140140
141141
142- @pytest .mark .parametrize ('delta_t' , [65.0 , None ])
142+ @pytest .mark .parametrize ('delta_t' , [65.0 , None , np . array ([ 65 , 65 ]) ])
143143def test_sun_rise_set_transit_spa (expected_rise_set_spa , golden , delta_t ):
144144 # solution from NREL SAP web calculator
145145 south = Location (- 35.0 , 0.0 , tz = 'UTC' )
@@ -478,14 +478,14 @@ def test_get_solarposition_altitude(
478478
479479
480480@pytest .mark .parametrize ("delta_t, method" , [
481- (None , 'nrel_numpy' ),
482- pytest .param (
483- None , 'nrel_numba' ,
484- marks = [pytest .mark .xfail (
485- reason = 'spa.calculate_deltat not implemented for numba yet' )]),
481+ (None , 'nrel_numba' ),
486482 (67.0 , 'nrel_numba' ),
483+ (np .array ([67.0 , 67.0 ]), 'nrel_numba' ),
484+ # minimize reloads, with numpy being last
485+ (None , 'nrel_numpy' ),
487486 (67.0 , 'nrel_numpy' ),
488- ])
487+ (np .array ([67.0 , 67.0 ]), 'nrel_numpy' ),
488+ ])
489489def test_get_solarposition_deltat (delta_t , method , expected_solpos_multi ,
490490 golden ):
491491 times = pd .date_range (datetime .datetime (2003 , 10 , 17 , 13 , 30 , 30 ),
@@ -506,6 +506,21 @@ def test_get_solarposition_deltat(delta_t, method, expected_solpos_multi,
506506 assert_frame_equal (this_expected , ephem_data [this_expected .columns ])
507507
508508
509+ @pytest .mark .parametrize ("method" , ['nrel_numba' , 'nrel_numpy' ])
510+ def test_spa_array_delta_t (method ):
511+ # make sure that time-varying delta_t produces different answers
512+ times = pd .to_datetime (["2019-01-01" , "2019-01-01" ]).tz_localize ("UTC" )
513+ expected = pd .Series ([257.26969492 , 257.2701359 ], index = times )
514+ with warnings .catch_warnings ():
515+ # don't warn on method reload
516+ warnings .simplefilter ("ignore" )
517+ ephem_data = solarposition .get_solarposition (times , 40 , - 80 ,
518+ delta_t = np .array ([67 , 0 ]),
519+ method = method )
520+
521+ assert_series_equal (ephem_data ['azimuth' ], expected , check_names = False )
522+
523+
509524def test_get_solarposition_no_kwargs (expected_solpos , golden ):
510525 times = pd .date_range (datetime .datetime (2003 , 10 , 17 , 13 , 30 , 30 ),
511526 periods = 1 , freq = 'D' , tz = golden .tz )
@@ -530,7 +545,7 @@ def test_get_solarposition_method_pyephem(expected_solpos, golden):
530545 assert_frame_equal (expected_solpos , ephem_data [expected_solpos .columns ])
531546
532547
533- @pytest .mark .parametrize ('delta_t' , [64.0 , None ])
548+ @pytest .mark .parametrize ('delta_t' , [64.0 , None , np . array ([ 64 , 64 ]) ])
534549def test_nrel_earthsun_distance (delta_t ):
535550 times = pd .DatetimeIndex ([datetime .datetime (2015 , 1 , 2 ),
536551 datetime .datetime (2015 , 8 , 2 )]
@@ -540,11 +555,12 @@ def test_nrel_earthsun_distance(delta_t):
540555 index = times )
541556 assert_series_equal (expected , result )
542557
543- times = datetime .datetime (2015 , 1 , 2 )
544- result = solarposition .nrel_earthsun_distance (times , delta_t = delta_t )
545- expected = pd .Series (np .array ([0.983289204601 ]),
546- index = pd .DatetimeIndex ([times , ]))
547- assert_series_equal (expected , result )
558+ if np .size (delta_t ) == 1 : # skip the array delta_t
559+ times = datetime .datetime (2015 , 1 , 2 )
560+ result = solarposition .nrel_earthsun_distance (times , delta_t = delta_t )
561+ expected = pd .Series (np .array ([0.983289204601 ]),
562+ index = pd .DatetimeIndex ([times , ]))
563+ assert_series_equal (expected , result )
548564
549565
550566def test_equation_of_time ():
@@ -770,14 +786,14 @@ def test__datetime_to_unixtime_units(unit, tz):
770786
771787
772788@requires_pandas_2_0
789+ @pytest .mark .parametrize ('tz' , [None , 'utc' , 'US/Eastern' ])
773790@pytest .mark .parametrize ('method' , [
774791 'nrel_numpy' ,
775792 'ephemeris' ,
776793 pytest .param ('pyephem' , marks = requires_ephem ),
777794 pytest .param ('nrel_numba' , marks = requires_numba ),
778795 pytest .param ('nrel_c' , marks = requires_spa_c ),
779796])
780- @pytest .mark .parametrize ('tz' , [None , 'utc' , 'US/Eastern' ])
781797def test_get_solarposition_microsecond_index (method , tz ):
782798 # https://github.com/pvlib/pvlib-python/issues/1932
783799
@@ -786,8 +802,12 @@ def test_get_solarposition_microsecond_index(method, tz):
786802 index_ns = pd .date_range (unit = 'ns' , ** kwargs )
787803 index_us = pd .date_range (unit = 'us' , ** kwargs )
788804
789- sp_ns = solarposition .get_solarposition (index_ns , 40 , - 80 , method = method )
790- sp_us = solarposition .get_solarposition (index_us , 40 , - 80 , method = method )
805+ with warnings .catch_warnings ():
806+ # don't warn on method reload
807+ warnings .simplefilter ("ignore" )
808+
809+ sp_ns = solarposition .get_solarposition (index_ns , 0 , 0 , method = method )
810+ sp_us = solarposition .get_solarposition (index_us , 0 , 0 , method = method )
791811
792812 assert_frame_equal (sp_ns , sp_us , check_index_type = False )
793813
0 commit comments