кратно, если условия в лямбде не работают должным образом - PullRequest
2 голосов
/ 18 марта 2019

У меня проблема при попытке собрать несколько условных выражений, если.

  • UDF.daysinmonth(x) возвращает количество дней в месяце
  • latest_date.month возвращает месяц объекта datetime(например, 3 для 2019-3-10) - latest_date=df['offtake_date'].max()
df.insert(loc=20, column='bbls_mbd_mth',value=df['bbls'] / df['offtake_date'].apply(lambda x: UDF.daysinmonth(x) if x.month!=latest_date.month and x.year!=latest_date.year else latest_date.day))

Это не работает, if x.month!=latest_date.month and x.year!=latest_date.year.За весь 2019 год он возвращает самый последний день в данных, а не количество дней в прошлых месяцах.Для 2018 года это работает нормально.

Это тоже не работает.

df.insert(loc=20, column='bbls_mbd_mth',value=np.nan)
for i, row in df.iterrows():
    ifor_val = df.at[i,'bbls']/latest_date.day
if ((df.at[i,'offtake_date'].month!=latest_date.month) and (df.at[i,'offtake_date'].year!=latest_date.year)):
    ifor_val = df.at[i,'bbls']/(UDF.daysinmonth(df.at[i,'offtake_date']))
df.at[i,'bbls_mbd_mth'] = ifor_val

Но это работает, когда я переключаю логику

for i, row in df.iterrows():
    ifor_val = df.at[i,'bbls']/(UDF.daysinmonth(df.at[i,'offtake_date'])
    if ((df.at[i,'offtake_date'].month==latest_date.month) and (df.at[i,'offtake_date'].year==latest_date.year)):
        ifor_val = df.at[i,'bbls']/latest_date.day)
    df.at[i,'bbls_mbd_mth'] = ifor_val

Я думаю, что яупущено что-то реальное основное .... любая помощь приветствуется.

1 Ответ

0 голосов
/ 18 марта 2019

Спасибо Джулиану за быстрый ответ. Я обнаружил свою ошибку, это логическая ошибка. Отсутствующая скобка - просто опечатка.

apply(lambda x: UDF.daysinmonth(x) if x.month!=latest_date.month and x.year!=latest_date.year else latest_date.day))

Я хотел применить самый последний день, только если дата попадает в последний месяц и год. Делая выше, это так же, как

apply(lambda x: UDF.daysinmonth(x) if x.year!=latest_date.year else latest_date.day))

независимо от месяца, а это не то, что я хочу. Я изменил логику, и это сработало

apply(lambda x: latest_date.day if x.month==latest_date.month and x.year==latest_date.year else UDF.daysinmonth(x)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...