meteostat-python icon indicating copy to clipboard operation
meteostat-python copied to clipboard

Time series data from Point locations does not retain station information

Open Intergalactyc opened this issue 6 months ago • 0 comments

Sorry, I accidentally closed this (was issue 196) when trying to reply to it. Unsure how I managed to do that haha.

The issue

When obtaining data given a Point location the stations used to obtain that data are not retained in the data object.

Minimal example

from meteostat import Point, Daily # Same for Monthly or Hourly as for Daily (any TimeSeries-based object)
from datetime import datetime

loc = Point(41.91, -91.65)
data = Daily(loc, datetime(2016,1,1), datetime(2017,1,1))
print(data.stations)

Printed: Index(['XXXXX'], dtype='object') Expected: Index(['72545', 'KIOW0'], dtype='string', name='id')

Indeed, loc.stations stores this expected stations index after using loc to construct data as above, but expected behavior is that these stations remain associated with the data as well.

Source code review

In timeseries.py, stations for a TimeSeries are set in _init_time_series with

        if isinstance(loc, pd.DataFrame):
            self._stations = loc.index
        elif isinstance(loc, Point):
            stations = loc.get_stations("daily", start, end, model)
            self._stations = stations.index
        else:
            if not isinstance(loc, list):
                loc = [loc]
            self._stations = pd.Index(loc)

However, if the location is a Point, this follows in the method:

        # Interpolate data spatially if requested
        # location is a geographical point
        if isinstance(loc, Point):
            self._resolve_point(loc.method, stations, loc.alt, loc.adapt_temp)

In meteodata.py, the method MeteoData._resolve_point which is called in the lines above concludes with

        # Set station index
        self._stations = pd.Index(["XXXXX"])

which overwrites the preexisting stations. This is then never updated. Because of this, the station(s) used to create the time series are lost. Commenting out this line of meteodata.py does revert behavior to expectation.

(I'm happy to work on a PR for this but I didn't want to cause any issues by removing what I see as the offending lines from MeteoData._resolve_point without first checking. Is there a good reason for setting the station to "XXXXX" in the first place?)

Intergalactyc avatar Aug 11 '25 18:08 Intergalactyc