如果一个字段中的日期早于特定日期并且两个字段匹配,则使字段之一为0

时间:2019-08-28 16:24:12

标签: python pandas

我有一个包含付款数据的数据框。我想检查付款日期是否早于2018年9月30日,如果余额等于费用金额,然后将余额设置为0.我试图核销任何早于2018年9月30日的余额。付款=余额。

如果余额和费用相等,则下面的代码似乎将一切都设为零。

class ModelViewSet(viewsets.ModelViewSet):
    permission_classes = (
        DefaultPermission,
        CustomPermission,
    )

输入

def MandT(df):
    if datetime.date(df['PaymentDate']) < datetime.date(2018, 9, 30):
        return 0 if df['Balance'] == df['Charge Amount'] else df['Balance']

df['Balance1'] = df.apply(MandT, axis=1)

预期输出

Date Svc_From_Amount Charge_Balance1 
8/1/2017 326.00 326.00 
8/1/2017 82.00 100.00 
8/1/2017 82.00 200.00 
10/2/2018 -156.00 -156.00 
12/1/2018 82.00 82.00 
8/1/2017 82.00 -5.00 
8/1/2017 82.00 8.00 

3 个答案:

答案 0 :(得分:0)

您可以使用.loc来设置值。我假设Balance1是您要添加的新列

#pop selected row of the balance 1 to 0
df.loc[(df['PaymentDate']) < datetime.date(2018, 9, 30)) & (df['Balance'] == df['Charge Amount']), 'Balance1'] =  0

#pop NaN row of the balance 1 to balance
df.loc[np.isnan(df['Balance1']), 'Balance1'] = df[np.isnan(df['Balance1'])]['Balance']

答案 1 :(得分:0)

我认为问题可能出在

if datetime.date(df['PaymentDate']) < datetime.date(2018, 9, 30):

由于您没有提供有关数据框的更多信息,我假设您的“付款日期”列中包含字符串格式的日期。如果我是对的,您可以尝试通过以下方式替换上面的代码:

if datetime.datetime.strptime(df['PaymentDate'], "%m/%d/%Y") < datetime.datetime(2018, 9, 30):

此代码会将您的日期转换为日期时间格式,以便进行比较。

答案 2 :(得分:0)

尝试一下是否可行。 您将必须在下面的代码中的所有位置适当地重命名这些列(如您的日期一样)。

df['Date']= pd.to_datetime(df['Date'],format='%m/%d/%Y')
def MandT(x):
    if ((x['Date']) < datetime.date(2018, 9, 30)) & (x['Charge_Balance1'] == x['Svc_From_Amount']):
        return 0 
    else:
        return x['Charge_Balance1']

df['Charge_Balance1'] = df.apply(MandT, axis=1)