Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NonExistentTimeError when calling hour_angle #2132

Open
scttnlsn opened this issue Jul 15, 2024 · 5 comments · May be fixed by #2133
Open

NonExistentTimeError when calling hour_angle #2132

scttnlsn opened this issue Jul 15, 2024 · 5 comments · May be fixed by #2133
Labels
Milestone

Comments

@scttnlsn
Copy link

Describe the bug

Cannot compute hour_angle in timezones and on a day where a daylight savings transition happens at midnight.

To Reproduce

from datetime import datetime, timedelta
import pytz
import pandas as pd
import pvlib

date = datetime(2014, 9, 7, 0, 0, 0, tzinfo=pytz.UTC)
times = pd.DatetimeIndex(
    [date + timedelta(hours=hour) for hour in range(24)]
).tz_convert("America/Santiago")

day_of_year = date.timetuple().tm_yday

equation_of_time = pvlib.solarposition.equation_of_time_spencer71(day_of_year)
declination = pvlib.solarposition.declination_spencer71(day_of_year)
hour_angle = pvlib.solarposition.hour_angle(
    times, 70.6693, equation_of_time
)

The call to times.normalize() inside hour_angle raises an exception:

pytz.exceptions.NonExistentTimeError: 2014-09-07 00:00:00

Expected behavior

I'm not entirely sure. Pandas' tz_localize includes arguments for handling these sort of situations (https://pandas.pydata.org/docs/reference/api/pandas.Series.dt.tz_localize.html) and I suspect we could normalize the times like this:

tz = times.tz
normalized_times = times.tz_localize(None).normalize().tz_localize(tz, nonexistent="shift_forward")

This would normalize the times to 1:00am instead of 12:00am (which didn't exist on that date). Here's some related discussion from a Pandas issue: pandas-dev/pandas#40517

I suspect we'd need to similarly handle ambiguous times when daylight savings ends.

Does this seem like a reasonable approach? I can put a small PR together if so.

Versions:

  • pvlib.__version__: 0.10.5
  • pandas.__version__: 2.2.2
  • python: 3.11.7
@cwhanse
Copy link
Member

cwhanse commented Jul 15, 2024

Confirmed the issue with pvlib v0.11.0.

The discussion around the pandas issue suggests this occurs when DST adjustment occurs in a way that midnight local never "happens".

Short of a worldwide deprecation of daylight savings times, or handling of this case by pandas.normalize, I suppose we ought to patch pvlib with liberal comments. rdtools worked around the problem in the similar way as proposed here https://github.com/NREL/rdtools/pull/373/files

@cwhanse
Copy link
Member

cwhanse commented Jul 15, 2024

@scttnlsn re-reading my comment, I don't think I was very clear: PR welcome along the lines you propose.

@scttnlsn
Copy link
Author

@cwhanse Sounds good - I'll put something together

@scttnlsn scttnlsn linked a pull request Jul 15, 2024 that will close this issue
6 tasks
@kandersolar kandersolar added this to the v0.11.1 milestone Aug 13, 2024
@kandersolar kandersolar modified the milestones: v0.11.1, v0.11.2 Sep 26, 2024
@AdamRJensen
Copy link
Member

@scttnlsn don't hesitate to reach out if you need help getting started with GitHub or the likes 😄

@scttnlsn
Copy link
Author

@AdamRJensen There's a PR open here: #2133 Let me know if anything needs more attention before merging.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants