From d03a3cb95bdf758d787f274d6a475f270b33431a Mon Sep 17 00:00:00 2001 From: kevin-s-ikegami <108323852+kevin-s-ikegami@users.noreply.github.com> Date: Mon, 8 Jun 2026 12:23:02 +0900 Subject: [PATCH] fix: handle string date indexes in gap stats --- .../model/pandas/describe_timeseries_pandas.py | 18 ++++++++++++++++++ tests/unit/test_time_series.py | 16 ++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/data_profiling/model/pandas/describe_timeseries_pandas.py b/src/data_profiling/model/pandas/describe_timeseries_pandas.py index 545ae6e03..def933578 100644 --- a/src/data_profiling/model/pandas/describe_timeseries_pandas.py +++ b/src/data_profiling/model/pandas/describe_timeseries_pandas.py @@ -173,12 +173,30 @@ def compute_gap_stats(series: pd.Series) -> pd.Series: A series with the gaps intervals. """ + empty_stats = { + "min": 0, + "max": 0, + "mean": 0, + "std": 0, + "series": series, + "gaps": [], + "n_gaps": 0, + } + gap = series.dropna() index_name = gap.index.name if gap.index.name else "index" gap = gap.reset_index()[index_name] gap.index.name = None is_datetime = isinstance(series.index, pd.DatetimeIndex) + if not is_datetime and not pd.api.types.is_numeric_dtype(gap): + datetime_gap = pd.to_datetime(gap, errors="coerce") + if datetime_gap.notna().all(): + gap = datetime_gap + is_datetime = True + else: + return empty_stats + gap_stats, gaps = identify_gaps(gap, is_datetime) has_gaps = len(gap_stats) > 0 diff --git a/tests/unit/test_time_series.py b/tests/unit/test_time_series.py index b28a04703..c67ab4041 100644 --- a/tests/unit/test_time_series.py +++ b/tests/unit/test_time_series.py @@ -3,6 +3,7 @@ import pytest from data_profiling import ProfileReport +from data_profiling.model.pandas.describe_timeseries_pandas import compute_gap_stats @pytest.fixture @@ -78,6 +79,21 @@ def test_timeseries_with_sortby(sample_ts_df): assert profile.config.vars.timeseries.sortby == "date" +def test_timeseries_gap_stats_with_string_date_index(): + # GH#1773 + dates = pd.date_range("2023-01-01", periods=10, freq="D").tolist() + dates.append(pd.Timestamp("2023-01-20")) + series = pd.Series( + np.arange(11, dtype=float), + index=pd.Index([date.strftime("%Y-%m-%d") for date in dates], name="Date Local"), + ) + + gap_stats = compute_gap_stats(series) + + assert gap_stats["n_gaps"] == 1 + assert gap_stats["min"] == pd.Timedelta(days=10) + + def test_timeseries_without_sortby(sample_ts_df): # Test time series without explicit sort column profile = ProfileReport(sample_ts_df, tsmode=True)