Вот решение (с использованием поддельных данных со случайным расположением NaN):
df = pd.DataFrame({"a": np.random.choice(list(np.arange(3)) + [np.NaN], len(time_range)),
"b": np.random.choice(list(np.arange(3)) + [np.NaN], len(time_range)),
"c": np.random.choice(list(np.arange(3)) + [np.NaN], len(time_range)),
"d": np.random.choice(list(np.arange(3)) + [np.NaN], len(time_range))},
index=time_range)
# count the number of nan in any given 18-months period
df["18_month_na"] = df.isna().sum(axis=1).rolling(18).sum()
# get the minimum.
df.loc[df["18_month_na"].idxmin()]