detect_clearsky and prilliman fail on DST days, kimber fails on tz-naive data (since #2924)

Open Beginner friendly
#2,935 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

@pranaysb is already working on this.

Since Nov 8, 2026.

  • #2937 by @pranaysb — open

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
72/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
python
Domain
data

Research direction

Start with _get_sample_intervals in pvlib/tools.py, which detect_clearsky and prilliman share, and with the kimber function in pvlib/soiling.py where it converts the index with tz_convert(None). Run the two reproductions in the issue to confirm the errors. Done means both run on a DST-spanning tz-aware index and a tz-naive index without errors, and the existing tests in test_clearsky.py, test_soiling.py, test_temperature.py and test_tools.py still pass.

Written by the indexing model from the issue text.

Description

On main (0f6631a, pandas 3.1.0), both of these worked before #2924 and now raise:

import pandas as pd
import pvlib

loc = pvlib.location.Location(49.28, -123.12, tz='America/Vancouver')
times = pd.date_range('2026-03-07', '2026-03-10', freq='1min',
                      tz=loc.tz, inclusive='left')
ghi = loc.get_clearsky(times)['ghi']
pvlib.clearsky.detect_clearsky(ghi, ghi)
# NotImplementedError: algorithm does not yet support unequal time intervals...

rain = pd.Series(0.0, index=pd.date_range('2026-01-01', periods=720, freq='h'))
pvlib.soiling.kimber(rain)
# TypeError: Cannot convert tz-naive timestamps, use tz_localize to localize

In _get_sample_intervals, tz_localize(None) turns the index into local clock time, so the 1-minute data gets a 61-minute step where the clocks change. temperature.prilliman uses the same helper, so it fails the same way.

https://github.com/pvlib/pvlib-python/blob/0f6631ac73da3833e9020df54776c467759cfb39/pvlib/tools.py#L432-L435

kimber uses tz_convert(None), which raises on a tz-naive index:

https://github.com/pvlib/pvlib-python/blob/0f6631ac73da3833e9020df54776c467759cfb39/pvlib/soiling.py#L197

What I'd suggest: subtract the timestamps directly. That gives elapsed time for both naive and tz-aware indexes.

# tools._get_sample_intervals
deltas = (times[1:] - times[:-1]) / pd.Timedelta('60s')

# soiling.kimber
timestep_interval = rainfall.index[1] - rainfall.index[0]
day_fraction = timestep_interval / pd.Timedelta(hours=24)

Plus two tests: detect_clearsky on a DST day should match the same data in UTC, and kimber with a tz-naive index should match the existing expected output.

I tried this locally:

  • both new tests fail on main and pass with the change;
  • test_clearsky.py, test_soiling.py, test_temperature.py and test_tools.py pass on pandas 3.1.0 and 2.3.3;
  • on the commit before #2924 (d6075f6), both examples run fine.

I didn't find an existing issue for this. Happy to open a PR if this sounds right.

AI disclosure: I used Claude Code (an AI coding agent) to find and trace this, run the examples and tests on my machine, and draft this note.

@echedey-ls @kandersolar

Dominant language
Python
Stars
1.7k
Forks
1.2k
Avg merge
3d 4h
Merged PRs (30d)
8

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from pvlib/pvlib-python

All issues in pvlib/pvlib-python

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.