#pandas #datetime #replace #slice #series
#панды #дата и время #заменять #ломтик #Серии
Вопрос:
У меня есть большой набор данных, который является импортированным расписанием (охватывающим несколько лет) для моей команды. Я очистил данные (сделал их длинными, а не широкими), однако я столкнулся с проблемой.
Сначала объяснение данных:
- «год» и «период» получаются из имени разделенного листа. Обе струны.
- «неделя» — неделя года, полученная из реестра. Поплавок.
- «дата», преобразованная из строки, для которой я написал функцию, поскольку даты были на голландском языке и их необходимо было нормализовать, год не был определен, поэтому используется год из первого столбца. После обработки; формат даты-времени.
- «сдвиг» тип смены, к которому он относится. S1 gt; рано, S2 gt;gt; поздно, S3 gt;gt;gt; ночь.
- Каждое правило назначается одному из моих сотрудников, эти имена удаляются по соображениям конфиденциальности.
- Я написал класс с несколькими методами, которые применяют правила, которые наше правительство применяет к расписаниям.
Теперь моя проблема:
Как вы можете видеть: записи 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. Это не проблема. Смотрите мой отредактированный ответ