2017-02-20 34 views
1

我有以下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

回答

2

解決方案:

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 
+0

咦......我再次得到了:'類型錯誤:int()函數的參數必須是一個字符串,一個類似字節的對象或數字,而不是'NoneType' – tumbleweed

+2

@tumbleweed,我想我需要一個__reproducible__數據集... – MaxU

+0

我更新了....問題是,有一些行沒有。 – tumbleweed