import datetime as dt from typing import List, Optional import pandas as pd __all__ = ["interpolate_series"] def interpolate_series( start_date: dt.datetime, end_date: dt.datetime, dates: List[dt.datetime], values: List[int], historical_date: Optional[dt.datetime] = None, historical_value: Optional[int] = None, ) -> List[int]: series = pd.Series(data=values, index=pd.DatetimeIndex(dates)) if dates[0] > start_date and historical_date is not None and historical_value is not None: # if there is something to fill at tail, and we have historical value interpolation_start_date = historical_date historical_series = pd.Series(data=(historical_value,), index=pd.DatetimeIndex((historical_date,))) series = pd.concat((historical_series, series)) else: interpolation_start_date = dates[0] series = series.reindex(pd.date_range(interpolation_start_date, end_date, freq="D")) # fill head with last known value series = series.interpolate(method="ffill", limit_area="outside") # interpolate everything else series = series.interpolate(method="time", limit_area="inside") # take only integer part series = series.astype("ulonglong") # Take only dates in the range # https://github.com/python/mypy/issues/2410 series = series[start_date:] # type: ignore return series.tolist()