使用日期范围替换 nan 日期

replacing nan dates using a date range

我有一个包含两列的数据框:日期和乘客人数。日期列的日期范围从 1950 年到 2019 年。但是,有些日期记录为 1600,这绝对是一个错误。当我尝试将日期对象更改为 datetimeindex 时,出现了一个有意义的越界错误。所以我决定先用 nan 值替换 1600 个日期

new_set=drop_dup.replace(to_replace =["1610-01-01", "1610/01/01"], 
             value = np.nan)

这只是将日期对象更改为日期时间索引的临时修复。以 1600 作为值的日期大约是 27,我不想将它们更改为单个值。相反,我想用某个日期范围替换那些 nan 值,即从 1955 年到 1982 年。下面的代码不起作用,但我的目标是类似

new_set=drop_dup.replace(to_replace =np.nan, value = pd.date_range(start='1-1-1955', end='1-1-1982', freq='12M')

所以这 27 1600 个日期应该在 1955 年到 1982 年之间

示例数据:

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,但 periodsum:

创建的缺失值数量
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