如果lambda中的条件未按预期运行,则为倍数

时间:2019-03-18 11:12:15

标签: python-3.x if-statement lambda

尝试将多个条件的条件拼凑在一起时遇到问题。

  • UDF.daysinmonth(x)返回一个月中的天数
  • latest_date.month返回日期时间对象的月份(例如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 :(得分:0)

感谢Julian的及时答复。我发现了错误,这是逻辑错误。缺少的括号只是拼写错误。

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

我只想在日期属于最近的月份和年份时才应用last_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)))