Я хочу определить, находится ли значение даты в субботу или воскресенье. Если да, то я хочу изменить указанную дату на предыдущую пятницу. (пример 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 *
В вашем случае использование 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
Я думаю, что что-то вроде этого также может быть возможно:
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"
)
Спасибо! Кроме того, если вы чувствуете себя полезным, лол, возможно, помогите мне с моим другим постом stackoverflow.com/questions/56371256/… :)