Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在一个数据框内规范化以下日期?_Python_Regex_Python 3.x_Pandas_Datetime - Fatal编程技术网

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