Как отформатировать январь-2018, т.е. как получить формат mon-year в python

Я пытаюсь изменить тип данных столбца в кадре данных pandas на тип даты из строки. Мой требуемый формат — понедельник-год (например, январь-2018). Я пытался:

dataframe['date_col'] = pd.to_datetime(dataframe['date_col'], format='%b-%Y')

Я получил следующее предупреждение, и вывод, который я получаю, имеет формат год-месяц-день, что-то вроде (2018-01-01).

main: 1: SettingWithCopyWarning: попытка установить значение для копии среза из DataFrame. Попробуйте вместо этого использовать .loc[row_indexer,col_indexer] = значение

См. предостережения в документации: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

Как получить выходной формат, который я хочу, это январь 2018 года.


person Shhiv    schedule 14.10.2018    source источник
comment
Можете ли вы предоставить первые пару строк ваших данных, чтобы воспроизвести эту проблему? Например df.head(5).   -  person Jan Trienes    schedule 14.10.2018
comment
usd_applicant_dataset['last_pymnt_d'].head(5) Out[25]: 0 января 2015 г. 1 апреля 2013 г. 2 июня 2014 г. 3 января 2015 г. 4 января 2016 г. Имя: last_pymnt_d, dtype: объект, после использования usd_applicant_dataset['last_pymnt_d '] = pd.to_datetime(usd_applicant_dataset['last_pymnt_d'], формат = '%b-%Y')Out[24]: 0 01.01.2015 1 01.04.2013 2 01.06.2014 3 2015- 01.01.4 01.01.2016 Имя: last_pymnt_d, dtype: datetime64[ns]   -  person Shhiv    schedule 14.10.2018
comment
Можете ли вы добавить эти данные к своему вопросу (как редактировать)? До применения pd.to_datetime и после.   -  person Jan Trienes    schedule 14.10.2018


Ответы (1)


datetime значения не хранятся в виде строк!

Они хранятся внутри как целые числа и должны быть полными: например, значение datetime должно включать день, месяц и год. Поэтому вы должны выбрать один из следующих вариантов:

  1. Сохраните свою серию с datetime dtype и просматривайте представление по умолчанию, т. е. 2018-01-01, когда вы отображаете или печатаете серию.
  2. Сохраните свою серию с object dtype и выберите представление по вашему выбору.

Не существует никаких "промежуточных" вариантов, позволяющих получить лучшее из обоих миров.

Вариант 1: datetime

Просто используйте pd.to_datetime так, как вы используете его сейчас. Вот демо:

df = pd.DataFrame({'date_col': ['Jan-2018', 'Oct-2018', 'Dec-2018']})

df['date_col'] = pd.to_datetime(df['date_col'], format='%b-%Y')

print(df, df['date_col'].dtype)

    date_col
0 2018-01-01
1 2018-10-01
2 2018-12-01 datetime64[ns]

Вариант 2: object

Ну, это именно то, что у вас есть на входе. Ничего не делать. Ваш входной формат '%b-%Y' уже имеет форму 'Jan-2018'.

Примечание по настройкеWithCopyWarning

Это предупреждение не имеет ничего общего с pd.to_datetime. По всей вероятности, ваш dataframe является неоднозначным фрагментом другого фрейма данных, и поэтому Pandas показывает предупреждение о том, что вы можете увидеть неожиданные результаты, если вы явно не скопируете фрейм данных. См. также Как бороться с SettingWithCopyWarning в Pandas?

person jpp    schedule 14.10.2018