我有一个类似于以下内容的数据框:-
df = pd.DataFrame(data={'Date':['12/05/2014', '12/05.2015', '12/05//2016'], 'Day':['Monday','Tuesday','Thursday']})
Date Day
0 12/05/2014 Monday
1 12/05.2015 Tuesday
2 12/05//2016 Thursday
我想清除日期列,其中某些日期的格式不正确。日期为字符串格式,清洗后将转换为日期格式。
我从其他stackoverfolw帖子中找到了一些帮助,并尝试了以下操作:-
1. Loop method
for idx, row in df.iterrows():
if '.' in df.loc[idx,'Date']:
df.loc[idx,'Date'].replace('.','/')
2. Regex method
df.Date.replace({'.','/'}, regex=True)
以上方法均未返回所需格式的日期,也未返回数据框。还有另一种可行的方法吗?
还有,有没有一种方法可以用一个命令用正确的字符串('/')替换两种字符串('。'和'//')?
答案 0 :(得分:1)
我会用replace
来做到这一点:
df['Date'].replace(r'\D+', '/', regex=True)
0 12/05/2014
1 12/05/2015
2 12/05/2016
Name: Date, dtype: object
df['Date'] = pd.to_datetime(df['Date'].replace(r'\D+', '/', regex=True))
df
Date Day
0 2014-12-05 Monday
1 2015-12-05 Tuesday
2 2016-12-05 Thursday
或者,str.replace
:
pd.to_datetime(df['Date'].str.replace(r'\D+', '/'))
0 2014-12-05
1 2015-12-05
2 2016-12-05
Name: Date, dtype: datetime64[ns]
模式\D+
将匹配不是数字的字符序列,并用一个正斜杠(这就是您想要的)替换所有字符。
另一个选择是extractall
,只是为了好玩。
pd.to_datetime(df['Date'].str.extractall(r'(\d+)')[0]
.unstack()
.set_axis(['month', 'day', 'year'], inplace=False, axis=1))
0 2014-12-05
1 2015-12-05
2 2016-12-05
dtype: datetime64[ns]
答案 1 :(得分:0)
您可以在“日期”列上使用.str
API,以单个斜杠替换点或多个斜杠。 .str.replace
默认使用正则表达式。
df.Date.str.replace(r'[\./]+', '/')