Как сравнить даты в датафрейме со значениями строк и столбцов, разделяя будние и праздничные дни - PullRequest
0 голосов
/ 09 октября 2018

У меня есть датафрейм, представляющий это:

Мне нужно создать еще один столбец 'Mark', и вот почему он сложен.Для значения 'C' день исполнения равен Sunday 8/11/2018.На следующий день будет Monday 9/11/2018.Поэтому мне нужно вычислить weekdays значения previous week.Для этого случая мне нужно вычислить 1/11/2018, 2/11/2018, 3/11/2018, 4/11/2018 и 5/11/2018.

Однако, если next day из execution day равно Friday или Saturday Мне нужно взять значения предыдущей недели 'Friday' и 'Saturday'.Например, B выполняется на Thursday 12/11/2018'.Следующий день - пятница.Поэтому мне нужно вычислить среднее значение Friday и Saturday на предыдущей неделе, которые равны 6/11/2018 и 7/11/2018

Изначально у меня не было столбца Day, который я добавил после слов с помощью

df['Execution']=pd.to_datetime(df['Execution'])
df['Day']=df['Execution'].dt.weekday_name

И я могу добраться до точки, где он что-то печатает, если execution date совпадает с одним из column dates.Вот код:

for j,row in df.iterrows():
x=str(row['Execution'])
x=x[slicing]

for i, val in enumerate (df.columns.values):
    print(df.columns[i])

    if i<l1:
        val=str(val)
        val=val[slicing]
        if x==val: #Execution date matches column date
            print('yay')

Я пытаюсь изучать Python самостоятельно, и я начал с изучения pandas dataframe.
Однако, сейчас я потерян и не могу понять логику дляпродолжить.Может ли кто-нибудь просветить меня таким путем?

1 Ответ

0 голосов
/ 10 октября 2018

Вот код, который работал для меня с объяснением:

for i,row in df.iterrows():
  for j, val in enumerate (range(0,l1-1)):   #l1 is the number of columns 
               #subtracted 1 to not take last column in account as I only need the dates

    if df.columns[j+1]==row['Execution']: #to match the date of column execution,with the column dates

        a=pd.to_datetime(df.columns[j+1+1])
        a=a.day_name() #to convert the date in to weekday name
#As for friday I would need previous week's friday and saturday values.
#Therefore, I subtracted 7 and 8 to get the required value. For all the other days I calculated carefully this way so that I get the days right.
        if (a=='Friday'): 
            mark=(df.iloc[i,(j+1+1-7)]+df.iloc[i,(j+1+1-6)])/2
#df.iloc(row,column) was used to get the values right
            markList.append(mark)
        elif (a=='Saturday'):
            mark=(df.iloc[i,(j+1+1-7)]+df.iloc[i,(j+1+1-8)])/2
            markList.append(mark)
        elif (a=='Sunday'):
            mark=(df.iloc[i,(j+1+1-7)]+df.iloc[i,(j+1+1-6)]+df.iloc[i,(j+1+1-5)]+MPDr.iloc[i,(j+1+1-4)]+df.iloc[i,(j+1+1-3)])/5
            markList.append(mark)
        elif (a=='Monday'):
            mark=(df.iloc[i,(j+1+1-7)]+df.iloc[i,(j+1+1-6)]+df.iloc[i,(j+1+1-5)]+df.iloc[i,(j+1+1-4)]+df.iloc[i,(j+1+1-8)])/5
            markList.append(mark)
        elif (a=='Tuesday'):
            mark=(df.iloc[i,(j+1+1-7)]+df.iloc[i,(j+1+1-6)]+df.iloc[i,(j+1+1-5)]+df.iloc[i,(j+1+1-8)]+df.iloc[i,(j+1+1-9)])/5
            markList.append(mark)
        elif (a=='Wednesday'):
            mark=(df.iloc[i,(j+1+1-7)]+df.iloc[i,(j+1+1-6)]+df.iloc[i,(j+1+1-8)]+df.iloc[i,(j+1+1-9)]+df.iloc[i,(j+1+1-10)])/5
            markList.append(mark)  
        elif (a=='Thursday'):
            mark=(df.iloc[i,(j+1+1-7)]+df.iloc[i,(j+1+1-8)]+df.iloc[i,(j+1+1-9)]+df.iloc[i,(j+1+1-10)]+df.iloc[i,(j+1+1-11)])/5
            markList.append(mark)

df['mark']=markList #To add at the end of the dataframe
...