2017-02-20 15 views
1

У меня есть следующие dates dataframe:Как нормализовать следующие даты внутри рамки данных pandas?

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

Ха ... снова я получил: 'TypeError: Int() аргумент должен быть строкой, байтовый объект или число, а не «NoneType» – tumbleweed

+2

@tumbleweed, я думаю, мне понадобится набор данных __reproducible__ ... – MaxU

+0

Я обновил .... проблема в том, что есть несколько строк с ничем. – tumbleweed

 Смежные вопросы

  • Нет связанных вопросов^_^