使用日期范围替换 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
,但 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
我有一个包含两列的数据框:日期和乘客人数。日期列的日期范围从 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
,但 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