Python 如何在一个数据框内规范化以下日期?
我有以下数据帧:Python 如何在一个数据框内规范化以下日期?,python,regex,python-3.x,pandas,datetime,Python,Regex,Python 3.x,Pandas,Datetime,我有以下数据帧: dates 0 2012 10 4 1 2 2012 01 19 3 20 6 11 4 20 10 7 5 19 11 12 6 7 2013 03 19 8 2016 2 5 9 2011 2 19 10 11 2011 05 23 12 2012 04 5 如何将日期列标准化为: dates 0 2012 10 04 1 2 2012 01 19 3 2020 06 11 4 2020 10 07 5 2019 11 12
dates
0 2012 10 4
1
2 2012 01 19
3 20 6 11
4 20 10 7
5 19 11 12
6
7 2013 03 19
8 2016 2 5
9 2011 2 19
10
11 2011 05 23
12 2012 04 5
如何将日期列标准化为:
dates
0 2012 10 04
1
2 2012 01 19
3 2020 06 11
4 2020 10 07
5 2019 11 12
6
7 2013 03 19
8 2016 02 05
9 2011 02 19
10
11 2011 05 23
12 2012 04 05
我尝试使用正则表达式,分别拆分和调整每一列。然而,我把任务复杂化了。是否可以将其规范化为后一个数据帧?。如果年份不完整,则规则为添加0
;如果年份不完整,则在字符串开头添加20
,格式为yyyymmdd
解决方案:
x = (df.loc[df.dates.str.contains(r'\d+\s*\d+\s*\d+'), 'dates']
.str.split(expand=True)
.rename(columns={0:'year',1:'month',2:'day'})
.astype(int)
)
x.loc[x.year <= 50, 'year'] += 2000
df['new'] = pd.to_datetime(x, errors='coerce').dt.strftime('%Y%m%d')
说明:
In [149]: df.loc[df.dates.str.contains(r'\d+\s*\d+\s*\d+'), 'dates']
Out[149]:
0 2012 10 4
2 2012 01 19
3 20 6 11
4 20 10 7
5 19 11 12
7 2013 03 19
8 2016 2 5
9 2011 2 19
11 2011 05 23
12 2012 04 5
Name: dates, dtype: object
In [152]: (df.loc[df.dates.str.contains(r'\d+\s*\d+\s*\d+'), 'dates']
...: .str.split(expand=True)
...: .rename(columns={0:'year',1:'month',2:'day'})
...: .astype(int))
Out[152]:
year month day
0 2012 10 4
2 2012 1 19
3 20 6 11
4 20 10 7
5 19 11 12
7 2013 3 19
8 2016 2 5
9 2011 2 19
11 2011 5 23
12 2012 4 5
嗯,再一次,提供一个可复制的数据集;)嗯,在你的“较短”版本中没有类似于
'09T'
的“数字”提示:首先清理你的数据:df.dates=df.dates.str.replace(r'\D+,'')
然后使用我的答案中的解决方案…似乎有些值有字母。。。。在应用最后一个正则表达式后,此问题已解决。@tumbleweed,欢迎使用。请下次提供可复制的数据集-这将大大节省您和我们的时间
In [149]: df.loc[df.dates.str.contains(r'\d+\s*\d+\s*\d+'), 'dates']
Out[149]:
0 2012 10 4
2 2012 01 19
3 20 6 11
4 20 10 7
5 19 11 12
7 2013 03 19
8 2016 2 5
9 2011 2 19
11 2011 05 23
12 2012 04 5
Name: dates, dtype: object
In [152]: (df.loc[df.dates.str.contains(r'\d+\s*\d+\s*\d+'), 'dates']
...: .str.split(expand=True)
...: .rename(columns={0:'year',1:'month',2:'day'})
...: .astype(int))
Out[152]:
year month day
0 2012 10 4
2 2012 1 19
3 20 6 11
4 20 10 7
5 19 11 12
7 2013 3 19
8 2016 2 5
9 2011 2 19
11 2011 5 23
12 2012 4 5