Дата форматирования в Pandas - PullRequest
2 голосов
/ 02 марта 2020

Я пытаюсь отформатировать столбец с датой в формате «месяц-год» без изменения значений без даты.

input_df = pd.DataFrame({'Period' :['2017-11-01 00:00:00', '2019-02-01 00:00:00', 'Mar 2020', 'Pre-Nov 2017', '2019-10-01 00:00:00' , 'Nov 17-Nov 18'] } )

input_df равен

enter image description here

ожидаемый результат:

enter image description here

Я устал от приведенного ниже кода, который не работал:

output_df['Period'] = input_df['Period'].apply(lambda x: x.strftime('%m %Y') if isinstance(x, datetime.date) else x)

Пожалуйста, помогите ..

1 Ответ

4 голосов
/ 02 марта 2020

Вы можете сделать с error='coerce' и fillna:

input_df['new_period'] = (pd.to_datetime(input_df['Period'], errors='coerce')
       .dt.strftime('%b %Y')
       .fillna(input_df['Period'])
    )

Выход:

                Period     new_period
0  2017-11-01 00:00:00       Nov 2017
1  2019-02-01 00:00:00       Feb 2019
2             Mar 2020       Mar 2020
3         Pre-Nov 2017   Pre-Nov 2017
4  2019-10-01 00:00:00       Oct 2019
5        Nov 17-Nov 18  Nov 17-Nov 18

Обновление : Второй, более безопасный вариант:

s = pd.to_datetime(input_df['Period'], errors='coerce')

input_df['new_period'] = np.where(s.isna(), input_df['Period'], 
                                  s.dt.strftime('%b %Y'))
...