Пользовательские день манипуляция неделю


Функция выполняет две функции следующим образом:

  1. Когда имеешь дело с день недели, Python всегда будет присвоить 0 для воскресенья и 6-суббота и я хочу изменить это. Первая часть кода меняется начало недели с воскресенья по предпочтению потребителей, т. е. понедельник или вторник.

  2. Второй раздел назначив правильный номер недели, основанные на новый день недели. Например, Новый День недели-это вторник и неделя задание должно быть со вторника по понедельник, а не воскресенье до суббота по умолчанию.

Код работает (очевидно), но я хочу, чтобы оптимизировать его. Текущий код занимает около 30 секунд для набора данных с более чем 2000 строк, которые, кажется, не быть нормальным. Задержка в основном в петлю, я не могу показаться, чтобы оптимизировать цикл, потому что это назначение номер недели в зависимости от условия. Условие простое, присвоить номер недели, пока он не достигнет нового торговца потом неделю сбрасывает.

def date_manipulate(df,startday):
    df['Month']=df.index.strftime("%B")
    df['DOW']=df.index.strftime("%A")
    week_offset = collections.OrderedDict()
    default_week =['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
    temp_week = default_week[startday:] + default_week[0:startday]
    for index, day in enumerate(temp_week):
        week_offset[day] = index
    df.replace({"DOW":week_offset},inplace=True)
    df=df.reset_index().sort_values(['merchant_name', 'date'],ascending=['True','True']).set_index(['date'])
    df['temp_date']=df.index.map(lambda x: x.toordinal())

    current_merchant=df['merchant_name'][0]
    offset=list(week_offset.values())[df['DOW'][0]]
    startdate=df['temp_date'][0]-(offset)
    enddate=startdate+6

    week=1
    df['week']=0
    df.reset_index(inplace=True)
    for counter, day in enumerate (df['temp_date']):
        if df['merchant_name'][counter]==current_merchant:
            if(df['temp_date'][counter])<=enddate:
                df.loc[counter,'week']=week
            else:
                enddate+=7
                week+=1
                df.loc[counter,'week']=week
        else:
            offset=list(week_offset.values())[df['DOW'][counter]]
            print(offset)
            current_merchant=df.loc[counter,'merchant_name']
            startdate=df.loc[counter,'temp_date']-(offset)
            enddate=startdate+6
            week=1
            df.loc[counter,'week']=week

    df.set_index('date',inplace=True)
    return df


Комментарии