Панды. Определите, выпадает ли дата в столбце панд на субботу или воскресенье

Я хочу определить, находится ли значение даты в субботу или воскресенье. Если да, то я хочу изменить указанную дату на предыдущую пятницу. (пример df и результат df ниже - это реальные даты с мая 2019 года, как вы можете видеть, в результатах df есть даты субботы (04.05.19) и воскресенья (26.05.19) на предыдущей неделе. , Дата (5/2/19) остается прежней, так как это будний день, а не выходной.

import pandas as pd
data = [['5/3/19','5/4/19'],['5/3/19','5/2/19'],['5/24/19','5/26/19']]
df = pd.DataFrame(data,columns=['Date1','Date2'])
print(df)


data2 = [['5/3/19','5/3/19'],['5/3/19','5/2/19'],['5/24/19','5/24/19']]
resultsdf = pd.DataFrame(data2,columns=['Date1','Date2'])
print(resultsdf)

Я запускаю этот код для диапазона от месяца до даты. Мне нужен код для группировки большого набора данных в представление MTD, но у меня возникают проблемы с созданием переменных для списка сб/воскресений (поскольку в месяц будет 8-10 выходных дней). Вот мой код:

import pandas as pd
import xlrd # added when using visual studio 
import datetime
from datetime import datetime
today = pd.to_datetime(datetime.now().date())
day_of_week = today.dayofweek
last_monday = today - pd.to_timedelta(day_of_week, unit='d')
month_day = today.day
start_month_scope = today - pd.to_timedelta(month_day, unit = 'd')
first_day_of_month = start_month_scope + pd.to_timedelta(1, unit = 'd')

Проблема с приведенным ниже кодом заключается в том, что он работает только в том случае, если мне нужно найти субботу и воскресенье в 7-дневный (пн-п) период.

last_sunday = last_monday + pd.to_timedelta(6, unit='d')
last_sat = last_sunday - pd.to_timedelta(1, unit='d')
last_fri = last_sunday - pd.to_timedelta(2, unit='d')

Мне нужна переменная для ввода кода ниже:

finaldf.loc[(finaldf['Due_Date'] == last_sat), 'Due_Date'] = last_fri

Таким образом, «last_fri» будет просто самой последней пятницей из данной субботы или воскресенья, поэтому, ссылаясь на мой пример df, есть пример 5/4/19, который возвращается к 5/3/19 (последняя пятница для этого экземпляра ) или 26.05.19 переносится на 24.05.19. Как вы можете видеть, код должен сначала понять, является ли дата субботой и воскресеньем, а затем ближайшей пятницей.

* если все вышеперечисленное сбивает с толку, просто сошлитесь на мой df -> resulftdf *

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
492
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В вашем случае использование BDay с np.where

df=df.apply(pd.to_datetime)
from pandas.tseries.offsets import BDay
for x in df.columns:
    df[x]=np.where(df[x].dt.weekday.isin([5,6]),df[x]-BDay(1),df[x])

df
Out[623]: 
       Date1      Date2
0 2019-05-03 2019-05-03
1 2019-05-03 2019-05-02
2 2019-05-24 2019-05-24

Спасибо! Кроме того, если вы чувствуете себя полезным, лол, возможно, помогите мне с моим другим постом stackoverflow.com/questions/56371256/… :)

0004 31.05.2019 01:49

Я думаю, что что-то вроде этого также может быть возможно:

finaldf['Due_Date'] = [x + pd.to_timedelta(4 - x.dayofweek, unit='d') if x.dayofweek > 4 else x for x in findaldf.Due_Date]
Ответ принят как подходящий

Вот один вкладыш:

df.Date1 -= pd.to_timedelta(
    (df.Date1.dt.dayofweek - 4).apply(lambda v: v if v > 0 else 0), unit = "D"
)

Другие вопросы по теме

Как получить словарь из столбцов в фрейме данных?
Как извлечь значение из фрейма данных Pandas из ссылки во фрейме, а затем «подняться» по фрейму до другого указанного значения?
У меня есть DF с 2 столбцами. Я хочу сделать логическую проверку
Как я могу разделить список слов, разделенных запятыми, в столбце Pandas?
Перечислите все возможные комбинации значений фрейма данных pandas для достижения определенной суммы
Большой (6 миллионов строк) pandas df вызывает ошибку памяти с `to_sql`, когда размер фрагмента = 100, но может легко сохранить файл размером 100 000 без размера фрагмента
Возвращение местоположения первого значения в местоположении фрейма данных, которое соответствует условию в фрейме данных pandas
Разобрать этот файл CSV и создать без использования Pandas?
Не могу понять, как правильно реализовать оператор if в фрейме данных с применением лямбда
Как выбрать значение из DataFrame (даже если записи нет)