Пример данных:
df = pd.DataFrame({'date': pd.to_datetime([np.nan] * 10 +
['2000-01-31','2001-01-31','2002-01-31'])})
print (df)
date
0 NaT
1 NaT
2 NaT
3 NaT
4 NaT
5 NaT
6 NaT
7 NaT
8 NaT
9 NaT
10 2000-01-31
11 2001-01-31
12 2002-01-31
Первая идея - создать маску для отсутствующих данных и добавить date_range
без конечного параметра, но с period
числом пропущенных значений, созданным sum
:
m = df['date'].isna()
df.loc[m, 'date'] = pd.date_range(start='1-1-1955', freq='12M', periods=m.sum())
print (df)
date
0 1955-01-31
1 1956-01-31
2 1957-01-31
3 1958-01-31
4 1959-01-31
5 1960-01-31
6 1961-01-31
7 1962-01-31
8 1963-01-31
9 1964-01-31
10 2000-01-31
11 2001-01-31
12 2002-01-31
Другая идея состоит в том, чтобы удалить start
, и к параметру end
добавляется минимальная дата, а к периоду также учитывается число пропущенных значений:
m = df['date'].isna()
df.loc[m, 'date'] = pd.date_range(end=df['date'].min(), freq='12M', periods=m.sum())
print (df)
date
0 1991-01-31
1 1992-01-31
2 1993-01-31
3 1994-01-31
4 1995-01-31
5 1996-01-31
6 1997-01-31
7 1998-01-31
8 1999-01-31
9 2000-01-31
10 2000-01-31
11 2001-01-31
12 2002-01-31