如果一个字段中的日期早于某个日期,并且两个字段匹配,则将其中一个字段设置为0

2024-09-29 02:16:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含付款数据的数据框。我想检查,如果付款日期早于2018年9月30日,并且如果余额等于费用金额,则将余额设置为0。如果付款=余额,则我尝试注销任何早于2018年9月30日的余额

如果余额和费用相等,下面的代码似乎使所有的东西都为零

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 

预期产量

Date Svc_From_Amount Charge_Balance1 
8/1/2017 326.00 0.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 0.00 
8/1/2017 -5.00 0.00 
8/1/2017 82.00 8.00

Tags: 数据fromdfdatetimedateifamount余额
3条回答

您可以使用.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']

试试看这样行不行。 您必须在下面的代码中适当地重命名所有位置的列(正如您在日期中所做的那样)

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)

我认为问题可能出在

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

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

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

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

相关问题 更多 >