Skip to content

Commit 7e03bec

Browse files
committed
fix error in test_get_sun_rise_set_transit (#161)
* increase get_sun_rise_set_transit precision, decrease test precision * add pandas 0131 incompat decorator * use astype on the series, not the values * add incompat again * back to values.astype... * try int64 instead for windows
1 parent 1f2994b commit 7e03bec

File tree

3 files changed

+48
-16
lines changed

3 files changed

+48
-16
lines changed

pvlib/solarposition.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -398,11 +398,11 @@ def get_sun_rise_set_transit(time, latitude, longitude, how='numpy',
398398
unixtime, lat, lon, delta_t, numthreads)
399399

400400
# arrays are in seconds since epoch format, need to conver to timestamps
401-
transit = pd.to_datetime(transit, unit='s', utc=True).tz_convert(
401+
transit = pd.to_datetime(transit*1e9, unit='ns', utc=True).tz_convert(
402402
time.tz).tolist()
403-
sunrise = pd.to_datetime(sunrise, unit='s', utc=True).tz_convert(
403+
sunrise = pd.to_datetime(sunrise*1e9, unit='ns', utc=True).tz_convert(
404404
time.tz).tolist()
405-
sunset = pd.to_datetime(sunset, unit='s', utc=True).tz_convert(
405+
sunset = pd.to_datetime(sunset*1e9, unit='ns', utc=True).tz_convert(
406406
time.tz).tolist()
407407

408408
result = pd.DataFrame({'transit': transit,

pvlib/test/__init__.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,18 @@ def incompatible_pandas_0180(test):
6363
out = test
6464

6565
return out
66+
67+
68+
def incompatible_pandas_0131(test):
69+
"""
70+
Test won't work on pandas 0.18.0 due to pandas/numpy issue with
71+
np.round.
72+
"""
73+
74+
if pd.__version__ == '0.13.1':
75+
out = unittest.skip(
76+
'error on pandas 0.13.1 due to pandas/numpy')(test)
77+
else:
78+
out = test
79+
80+
return out

pvlib/test/test_solarposition.py

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from pvlib.location import Location
1515
from pvlib import solarposition
1616

17-
from . import requires_ephem
17+
from . import requires_ephem, incompatible_pandas_0131
1818

1919
# setup times and locations to be tested.
2020
times = pd.date_range(start=datetime.datetime(2014,6,24),
@@ -141,23 +141,31 @@ def test_spa_python_numba_physical_dst():
141141
assert_frame_equal(this_expected, ephem_data[expected.columns])
142142

143143

144+
@incompatible_pandas_0131
144145
def test_get_sun_rise_set_transit():
145146
south = Location(-35.0, 0.0, tz='UTC')
146147
times = pd.DatetimeIndex([datetime.datetime(1996, 7, 5, 0),
147148
datetime.datetime(2004, 12, 4, 0)]
148149
).tz_localize('UTC')
149-
sunrise = pd.DatetimeIndex([datetime.datetime(1996, 7, 5, 7, 8, 15, 471676),
150-
datetime.datetime(2004, 12, 4, 4, 38, 57, 27416)]
150+
sunrise = pd.DatetimeIndex([datetime.datetime(1996, 7, 5, 7, 8, 15),
151+
datetime.datetime(2004, 12, 4, 4, 38, 57)]
151152
).tz_localize('UTC').tolist()
152-
sunset = pd.DatetimeIndex([datetime.datetime(1996, 7, 5, 17, 1, 4, 479889),
153-
datetime.datetime(2004, 12, 4, 19, 2, 2, 499704)]
153+
sunset = pd.DatetimeIndex([datetime.datetime(1996, 7, 5, 17, 1, 4),
154+
datetime.datetime(2004, 12, 4, 19, 2, 2)]
154155
).tz_localize('UTC').tolist()
155156
result = solarposition.get_sun_rise_set_transit(times, south.latitude,
156157
south.longitude,
157158
delta_t=64.0)
158159
frame = pd.DataFrame({'sunrise':sunrise, 'sunset':sunset}, index=times)
159-
del result['transit']
160-
assert_frame_equal(frame, result)
160+
result_rounded = pd.DataFrame(index=result.index)
161+
# need to iterate because to_datetime does not accept 2D data
162+
# the rounding fails on pandas < 0.17
163+
for col, data in result.iteritems():
164+
result_rounded[col] = pd.to_datetime(
165+
np.floor(data.values.astype(np.int64) / 1e9)*1e9, utc=True)
166+
167+
del result_rounded['transit']
168+
assert_frame_equal(frame, result_rounded)
161169

162170

163171
# tests from USNO
@@ -166,18 +174,27 @@ def test_get_sun_rise_set_transit():
166174
times = pd.DatetimeIndex([datetime.datetime(2015, 1, 2),
167175
datetime.datetime(2015, 8, 2),]
168176
).tz_localize('MST')
169-
sunrise = pd.DatetimeIndex([datetime.datetime(2015, 1, 2, 7, 19, 2, 225169),
170-
datetime.datetime(2015, 8, 2, 5, 1, 26, 963145)
177+
sunrise = pd.DatetimeIndex([datetime.datetime(2015, 1, 2, 7, 19, 2),
178+
datetime.datetime(2015, 8, 2, 5, 1, 26)
171179
]).tz_localize('MST').tolist()
172-
sunset = pd.DatetimeIndex([datetime.datetime(2015, 1, 2, 16, 49, 10, 13145),
173-
datetime.datetime(2015, 8, 2, 19, 11, 31, 816401)
180+
sunset = pd.DatetimeIndex([datetime.datetime(2015, 1, 2, 16, 49, 10),
181+
datetime.datetime(2015, 8, 2, 19, 11, 31)
174182
]).tz_localize('MST').tolist()
175183
result = solarposition.get_sun_rise_set_transit(times, golden.latitude,
176184
golden.longitude,
177185
delta_t=64.0)
178186
frame = pd.DataFrame({'sunrise':sunrise, 'sunset':sunset}, index=times)
179-
del result['transit']
180-
assert_frame_equal(frame, result)
187+
result_rounded = pd.DataFrame(index=result.index)
188+
# need to iterate because to_datetime does not accept 2D data
189+
# the rounding fails on pandas < 0.17
190+
for col, data in result.iteritems():
191+
result_rounded[col] = (pd.to_datetime(
192+
np.floor(data.values.astype(np.int64) / 1e9)*1e9, utc=True)
193+
.tz_convert('MST'))
194+
195+
del result_rounded['transit']
196+
assert_frame_equal(frame, result_rounded)
197+
181198

182199
@requires_ephem
183200
def test_pyephem_physical():

0 commit comments

Comments
 (0)