Python ir SUM IF

Kartais šį blogą panaudoju tiesiog kaip užrašų knygelę, kad ateityje lengviau rasčiau kai kuriuos dalykus. Tai va dabar ir papostinsiu čia scripto dalį, kurio šiaip gan ilgokai ieškojau, ir paskui dar ilgokai trukau kol sau prisitaikiau. Tai, kad kitą kartą nereikėtų ilgai su šituo vargti, tai va dar vienas jau sukramtytas ir veikiantis ir veikiantis scriptas į archyvą.

Tai prisireikė man tokio scriptuko, kuris kiekvienai dienai, paskaičiuotų per ankstesnes 7 dienas dirbtų valandų sumą. Čia siekiant įgyvendinti vieną projektėlį susijusį darbo kodekso straipsniais apie suminę darbo laiko apskaitą.

Kokiam nors exceliuke, tai užtektų pasirašyti formulytę, pratempti ją per visą stulpelį ir rezultatą turi. Bet man excelis jau seniai palaidotas reikalas, todėl siekiant automatizuoto rezultato vėl pasiėmiau į pagalbą pythoną.

Čia bibliotekos, kurių reikėjo visam scriptui:

import pyodbc
import pandas as pd
import time
import os
import numpy as np
import datetime
from datetime import datetime, timedelta

O čia scripto dalis, kuri sukuria papildomą stulpelį ir atlieka visą magiją. Tiesa, veikia ji gan ilgokai, todėl jei naudosit, nusiteikit garsiam kompo aušintuvų ūžimui.

df['7d_sum_of_value'] = 0

for index1, row1 in df.iterrows(): # Iterate over all rows in data
    rolling_sum = row1['VALAND_SK'] # Initialize rolling_sum
    group_data = df[df['DARBUOTOJAS'] == row1['DARBUOTOJAS']] # Choose subset of data that pertains to the appropriate group
    for index2, row2 in group_data.iterrows(): 
        date_diff = datetime.strptime(row1['DATA'], '%Y-%m-%d')-datetime.strptime(row2['DATA'], '%Y-%m-%d') # Get time difference between two dates
        if (date_diff >= timedelta(0)) and (date_diff < timedelta(7)) and (index1 != index2):
            rolling_sum += row2['VALAND_SK'] # Update rolling sum
    df.at[index1, '7d_sum_of_value'] = rolling_sum

Parašykite komentarą