如何规范化熊猫数据框中的以下日期?
Posted
技术标签:
【中文标题】如何规范化熊猫数据框中的以下日期?【英文标题】:How to normalize the following dates inside a pandas dataframe? 【发布时间】:2017-07-10 08:20:26 【问题描述】:我有以下dates 数据框:
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
。
【问题讨论】:
【参考方案1】:解决方案:
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 [148]: df
Out[148]:
dates new
0 2012 10 4 20121004
1 NaN
2 2012 01 19 20120119
3 20 6 11 20200611
4 20 10 7 20201007
5 19 11 12 20191112
6 NaN
7 2013 03 19 20130319
8 2016 2 5 20160205
9 2011 2 19 20110219
10 NaN
11 2011 05 23 20110523
12 2012 04 5 20120405
解释:
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
【讨论】:
呵呵,再次提供一个REPRODUCIBLE数据集;) 嗯,在您的“较短”版本中,没有像'09T'
这样的“数字”
提示:首先清理您的数据:df.dates = df.dates.str.replace(r'\D+', ' ')
然后使用我的答案中的解决方案...
似乎有些值有字母....应用最后一个正则表达式后,这个问题就解决了。
@tumbleweed,不客气。下次请提供可重复的数据集 - 这将大大节省您和我们的时间以上是关于如何规范化熊猫数据框中的以下日期?的主要内容,如果未能解决你的问题,请参考以下文章
如何按 > 日期对一系列日期求和并将它们附加到熊猫新数据框中的新列?