我有一个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
答案 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个字符(如果年份介于2015
和2019
之间):
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