Изменение года фрагмента/серии, полученного из фрейма данных pandas

#pandas #datetime #replace #slice #series

#панды #дата и время #заменять #ломтик #Серии

Вопрос:

У меня есть большой набор данных, который является импортированным расписанием (охватывающим несколько лет) для моей команды. Я очистил данные (сделал их длинными, а не широкими), однако я столкнулся с проблемой.

Сначала объяснение данных:

  • «год» и «период» получаются из имени разделенного листа. Обе струны.
  • «неделя» — неделя года, полученная из реестра. Поплавок.
  • «дата», преобразованная из строки, для которой я написал функцию, поскольку даты были на голландском языке и их необходимо было нормализовать, год не был определен, поэтому используется год из первого столбца. После обработки; формат даты-времени.
  • «сдвиг» тип смены, к которому он относится. S1 gt; рано, S2 gt;gt; поздно, S3 gt;gt;gt; ночь.
  • Каждое правило назначается одному из моих сотрудников, эти имена удаляются по соображениям конфиденциальности.
  • Я написал класс с несколькими методами, которые применяют правила, которые наше правительство применяет к расписаниям.

предварительно обработанные данные DF

Теперь моя проблема:

Как вы можете видеть: записи 1137 и 1138 должны относиться к 2022 году. Но как мне это легко изменить? Я пытался:

 for week, date in prepocessed_data_merged[['week', 'date']].values:  # There are always more than 52 weeks in a year.  # If the month of the date in week 52 is 1 (Jan), then something is wrong.  if (week == 52) amp; (date.month == 1):  prepocessed_data_merged.loc[(prepocessed_data_merged['week'] == week)  amp; (prepocessed_data_merged['date']), 'date'] = ???  

Но, как и следовало ожидать, это возвращает серию, так как в день три смены, поэтому три записи даты, для которых требуется изменить их год. Итак, как можно изменить год выбранной серии/среза, одновременно изменив его в кадре данных?

Я знаю, что могу использовать: dt.replace(year=current_year 1) но как я могу применить это replace к этой выбранной серии в DF preprocessed_data? Заранее спасибо!

Ответ №1:

Вы пробовали:

 cond = prepocessed_data_merged['week'].eq(52) amp; prepocessed_data_merged['date'].dt.month.eq(1) prepocessed_data_merged.loc[cond, 'date']  = pd.DateOffset(years=1)  

Комментарии:

1. Я попробовал это сделать, но это не сработало, так как нет столбца «месяц». Если есть способ получить доступ к нему из столбца «дата», скажите мне! Однако я нашел кое-что еще, что сработало. Я отвечу на этот вопрос. Если у вас есть предложение сделать его более питоническим, пожалуйста, ответьте, так как у меня такое чувство, что это могло бы быть лучше.

2. Да, вы используете prepocessed_data_merged['date'].dt.month

3. Ах, да, я вижу, что вы здесь сделали. Это действительно решает проблему, хотя и частично. Видите ли, я не хочу менять год в столбце «год». Я хочу изменить год в столбце «дата», который принадлежит объекту datetime. Причина этого в том, что я хочу отфильтровать DF по годам, поэтому я хотел бы получить все списки в 2021 году. С вашим фрагментом последние записи за этот год исчезнут.

4. Могу ли я добавить, что я буду выполнять ваши условия подачи заявок. Намного аккуратнее и понятнее.

5. Это не проблема. Смотрите мой отредактированный ответ