Суммировать столбец на основе двух дат в другом фрейме данных - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь суммировать столбец, если он попадает между двумя датами и основан на jobid. Я использую приведенную ниже функцию, но в качестве значения суммы я сохраняю ноль.

def jobrun (row):
return table1[(table1.job == row['job']) & \
        (table1.date >= row['past']) & \
        (table1.date < row['present'])]['Hours'].sum()

table2['Usage'] = table2.apply(lambda row: jobrun(row), axis = 1)

Все столбцы даты преобразуются в <datecolumn>.astype('datetime64').dt.strftime('%d/%m/%Y')

Пожалуйста, дайте мне знать, что я пропустил.

enter image description here

enter image description here

Table1      
Job Hours   Date
706010  2.935   01/03/20
706010  14.9936 02/03/20
706010  14.9079 03/03/20
706010  11.1339 04/03/20
706010  0.0172  06/03/20
706010  0.0172  07/03/20
706011  0.0175  10/03/20
706011  0.0508  14/03/20
706011  0.085   16/03/20
706011  0.0347  17/03/20
706011  0.0078  18/03/20
706011  0.0169  30/03/20
706011  0.0006  01/04/20
706011  0.0172  04/04/20
706011  2.642   05/04/20
706011  6.5853  06/04/20
706011  0.2653  07/04/20
706011  0.0175  08/04/20
706012  0.0375  09/04/20
706012  0.0339  12/04/20
706012  0.0169  13/04/20
706012  0.0167  15/04/20
706012  0.1169  20/04/20
706012  0.3003  21/04/20
706012  0.0169  26/04/20
706012  6.7994  30/10/19



Table2          
Job past    present 
706010  31/07/2019  2020-04-05  
706011  31/11/2019  2020-05-05  
706012  31/07/2019  2020-05-05  


Expected Output         
Job past    present Usage
706010  31/07/2019  2020-04-05  44
706011  31/11/2019  2020-05-05  9
706012  31/07/2019  2020-05-05  7

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Использование:

def jobrun(row):
    m1 = table1["Job"].eq(row["Job"])

    past = pd.to_datetime(row["past"], format="%d/%m/%Y", errors="coerce")
    present = pd.to_datetime(row["present"], format="%Y-%d-%m", errors="coerce")

    if pd.isna(past): # in case your row contains out of bounds date like 31/11/2019
        m2 = pd.to_datetime(table1["Date"], format="%d/%m/%y").le(present)
    else:
        m2 = pd.to_datetime(table1["Date"], format="%d/%m/%y").between(past, present)

    return table1.loc[m1 & m2, "Hours"].sum().astype(int)


table2['Usage'] = table2.apply(jobrun, axis=1)
print(table2)

Печать:

      Job        past     present  Usage
0  706010  31/07/2019  2020-04-05     44
1  706011  31/11/2019  2020-05-05      9
2  706012  31/07/2019  2020-05-05      7
0 голосов
/ 04 мая 2020

Я не думаю, что вы можете применить jobrun к двум кадрам данных, потому что это даст вам ошибку как ValueError: Can only compare identically-labeled Series objects. (как упомянуто в одном из комментариев)

Вы можете попробовать выполнить внешнее объединение table1 и row на основе столбца job, затем изменить jobrun и применить его к весь объединенный фрейм данных df1:

df1=table1.merge(row,left_on='job',right_on='job',how='outer')
def jobrun (df):
    df_out=df[(df.date >= df['past']) & \
        (df.date < df['present'])]
    df_out['Usage']=df_out['Hours'].sum()
    return df_out
jobrun(df1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...