Python 使用日期范围替换日期
我有一个数据框,它有两列:日期和传递者的数量。“日期”列的日期范围为1950年至2019年。然而,有些日期被记录为1600,这显然是一个错误。当我尝试将date对象更改为datetimeindex时,我得到一个越界错误,这是有意义的。所以我决定先用nan值替换1600个日期Python 使用日期范围替换日期,python,pandas,dataframe,python-datetime,Python,Pandas,Dataframe,Python Datetime,我有一个数据框,它有两列:日期和传递者的数量。“日期”列的日期范围为1950年至2019年。然而,有些日期被记录为1600,这显然是一个错误。当我尝试将date对象更改为datetimeindex时,我得到一个越界错误,这是有意义的。所以我决定先用nan值替换1600个日期 new_set=drop_dup.replace(to_replace =["1610-01-01", "1610/01/01"], value = np.nan) 这只是将date对象更改为d
new_set=drop_dup.replace(to_replace =["1610-01-01", "1610/01/01"],
value = np.nan)
这只是将date对象更改为datetimeindex的临时修复程序。值为1600的日期约为27,我不想将其更改为单个值。相反,我想用一个特定的日期范围,即从1955年到1982年,来替换那些nan值。下面的代码不起作用,但我的目标是类似的东西
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\u range
,不带结束参数,但按sum
创建的缺失值的数量添加period
:
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
另一个想法是删除开始
,并在参数结束
中添加最小日期和期间,以及缺失值的计数:
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
样本数据:
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\u range
,不带结束参数,但按sum
创建的缺失值的数量添加period
:
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
另一个想法是删除开始
,并在参数结束
中添加最小日期和期间,以及缺失值的计数:
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
我尝试了上面的方法,但是我一直得到一个类型错误“series”对象callable@Tamarie-你的解决方案是如何改变的?它刚刚起作用,结果我错过了总和()在结尾处,我尝试了上述操作,但始终得到一个类型错误“series”object notcallable@Tamarie-你的解决方案是如何改变的?它只是起作用了,结果我错过了最后的sum()