在pandas数据框中本地化和更改date

我有一个pandas数据框,我得到一个Excel文件,定期更新。 在一列中,我有一个datedatetime64。 它不被用作索引。 条目从2015年到目前的date。 有时候,人们会错误地inputdate。 所以我知道date是1945-11-05有一个条目,正确的是2015-11-05。 这个单元格的行在每次更新excel文件时都会更改,所以我不能用行/列号本地化它。 我想更新这个单元格到正确的date。 我怎样才能本地化这个细胞并改变这一年?

数据框如下所示:

article_number order_number date quantity 1234 abcd 2015-08-16 123 1234 xyz 2015-09-01 456 2342 qsdf 2015-01-04 12 4223 qwerty 1945-11-05 155 0815 qwertz 2016-01-01 667 

本地化:

 In [128]: df.loc[df['date'].dt.year < 2015] Out[128]: article_number order_number date quantity 3 4223 qwerty 1945-11-05 155 

改变:

 df.loc[df['date'].dt.year < 2015, 'date'] = \ df.loc[df['date'].dt.year < 2015, 'date'].map(lambda x: x.replace(year=2015)) 

结果:

 In [137]: df Out[137]: article_number order_number date quantity 0 1234 abcd 2015-08-16 123 1 1234 xyz 2015-09-01 456 2 2342 qsdf 2015-01-04 12 3 4223 qwerty 2015-11-05 155 4 815 qwertz 2016-01-01 667 

用于本地化使用boolean indexing

 print (df[df['date'].dt.year < 2015]) article_number order_number date quantity 3 4223 qwerty 1945-11-05 155 

取代前3个字符是可能的使用(如果年数在20152019年之间):

 df['date'] = pd.to_datetime('201' + df['date'].astype(str).str[3:]) print (df) article_number order_number date quantity 0 1234 abcd 2015-08-16 123 1 1234 xyz 2015-09-01 456 2 2342 qsdf 2015-01-04 12 3 4223 qwerty 2015-11-05 155 4 815 qwertz 2016-01-01 667 

要么:

 df['date'] = pd.to_datetime('201' + df['date'].dt.strftime('%y-%m-%m').str[1:]) print (df) article_number order_number date quantity 0 1234 abcd 2015-08-08 123 1 1234 xyz 2015-09-09 456 2 2342 qsdf 2015-01-01 12 3 4223 qwerty 2015-11-11 155 4 815 qwertz 2016-01-01 667 

也可以使用mask ,只取代2015值:

 m = df['date'].dt.year < 2015 df['date'] = df['date'].mask(m, pd.to_datetime('201' + df['date'].dt.strftime('%y-%m-%m').str[1:])) print (df) article_number order_number date quantity 0 1234 abcd 2015-08-16 123 1 1234 xyz 2015-09-01 456 2 2342 qsdf 2015-01-04 12 3 4223 qwerty 2015-11-11 155 4 815 qwertz 2016-01-01 667 

但是如果要换一个date使用replace

 df['date'] = df['date'].replace(pd.to_datetime('1945-11-05'), pd.to_datetime('2015-11-05')) print (df) article_number order_number date quantity 0 1234 abcd 2015-08-16 123 1 1234 xyz 2015-09-01 456 2 2342 qsdf 2015-01-04 12 3 4223 qwerty 2015-11-05 155 4 815 qwertz 2016-01-01 667