2016-07-11 2 views
4

У меня есть кадр данных pandas с столбцом 'date_of_birth'. Значения принимают форму 1977-10-24T00:00:00.000Z, например.Отбрасывание значений столбцов, которые не отвечают требованиям

Я хочу, чтобы захватить год, поэтому я попытался следующее:

X['date_of_birth'] = X['date_of_birth'].apply(lambda x: int(str(x)[4:])) 

Это работает, если я гарантировал, что первые 4 буквы всегда целые числа, но она не по моим данным, установленным как некоторые даты испорченный или мусор. Есть ли способ настроить мою лямбду без использования регулярного выражения? Если нет, как я могу написать это в регулярном выражении?

+6

Вы можете просто преобразовать в дату 'df ['date_of_birth'] = pd.to_datetime (df ['date_of_birth'], errors = 'coerce')', и тогда вы можете сделать 'df ['date_of_birth']. year' – EdChum

ответ

2

Я думаю, было бы лучше просто использовать to_datetime преобразовать в datetime DTYPE, вы можете отбросить недопустимые строки с помощью dropna, а также доступ только атрибута года, используя dt.year:

In [58]: 
df = pd.DataFrame({'date':['1977-10-24T00:00:00.000Z', 'duff', '200', '2016-01-01']}) 
df['mod_dates'] = pd.to_datetime(df['date'], errors='coerce') 
df 

Out[58]: 
         date mod_dates 
0 1977-10-24T00:00:00.000Z 1977-10-24 
1      duff  NaT 
2      200  NaT 
3    2016-01-01 2016-01-01 

In [59]:  
df.dropna() 

Out[59]: 
         date mod_dates 
0 1977-10-24T00:00:00.000Z 1977-10-24 
3    2016-01-01 2016-01-01 

In [60]: 
df['mod_dates'].dt.year 

Out[60]: 
0 1977.0 
1  NaN 
2  NaN 
3 2016.0 
Name: mod_dates, dtype: float64 
+0

Спасибо @EdChum, короткий и лаконичный. –

+1

Я бы предпочел этот подход, так как в итоге вы столкнулись с колонкой, с которой вы можете выполнить надлежащую работу и получить полную проверку дат. Однако, если кто-то действительно настаивал на том, чтобы просто взять 4 цифры (и в основном для ссылки), тогда 'df ['date']. Str.extract ('^ (\ d {4})', expand = False) .astype (float) 'есть возможность ... –

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