0

我需要根据日期列创建一个新列作为计费和非计费。

第 1 列的条件:如果开始日期是NULLOR BLANK(OR) 如果它的开始日期在“未来日期”(OR) 如果它的开始日期在“过去日期”(OR) 如果它的结束日期在过去日期那么我应创建一个新列作为非计费。

第 2 列的条件:如果开始日期在“当前日期”中,则需要创建一个新列作为“可计费”并需要计算它。计算应该在行轴上。

连续计费计算:Billing = df[Billing] * sum/168 * 100

非计费行计算:Non-Billing = df[Non-Billing] * sum/ 168 * 100

数据:

Employee Name  |    Java  |  Python  | .NET  |  React  |  Start Date   |  End Date    |                                

|Anu           |    10    |     10   |   5   |     5   |  04-21-2021   |              |                                 
|Kalai         |          |     10   |       |     5   |  04-21-2021   |  10-31-2021  |                                 
|Smirthi       |          |     10   |   20  |         |  03-21-2021   |              |                               
|Madhu         |    20    |     10   |   10  |         |  01-12-2021   |              |
|Latha         |    40    |          |   5   |         |               |              |                                 

输入

输入

输出

输出

代码:

# Adding new columns 
total=df.sum(axis=1) 
df.insert(len(df.columns),column='Total',value=total) 
    
# Adding Utilization column utilization = (total/168) 
df.insert(len(df.columns), column='Utilization', value=utilization) 
    
# Filter dataframe using groupby 
df1 = df.groupby(['Employee Name']).sum(min_count=1) 
df1['Available'] = 168
4

1 回答 1

0

我不太了解条件,因为似乎存在一些不一致之处,但我相信这将帮助您入门:

import pandas as pd 
import numpy as np
import datetime

df['Total'] = df.sum(axis=1)
df['Available']=168
df['Amount']=df['Total']/df['Available']*100
df['Billing']=np.NaN
df['NonBilling']=np.NaN
df.loc[df['Start Date']==datetime.date.today(),'Billing']= df['Amount']
df.loc[df['Start Date']!=datetime.date.today(),'NonBilling']= df['Amount']

笔记:

  1. 确保日期类型与今天的日期进行比较,如果您的日期被加载为对象,您可能希望在加载后执行以下操作:

    df['开始日期']= pd.to_datetime(df['开始日期']).dt.date

  2. 制定 Billing/NonBilling 的条件,以确保按预期填充列

于 2021-04-21T13:13:13.847 回答