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

时间:2017-07-21 07:04:45

标签: python excel pandas dataframe

我有一个pandas数据框,我从一个定期更新的excel文件中获取。 在一列中,我的日期为datetime64。它不用作索引。 这些条目从2015年到当前日期。 有时,人们会错误地输入日期。所以我知道有一个条目的日期是1945-11-05,正确的是2015-11-05。每次更新excel文件时,单元格的这一行都会更改,因此我无法使用行/列编号对其进行本地化。 我想将此单元格更新为正确的日期。 如何本地化此单元格并更改年份?

数据框如下所示:

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

2 个答案:

答案 0 :(得分:1)

本地化:

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

答案 1 :(得分:1)

对于本地化使用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

但如果只想更改一个日期,请使用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