martedì 21 novembre 2023

Calcolo in python dei giorni lavorativi (lunedì venerdì) per anno 2023, escludendo le feste se capitano dal lunedì al venerdì.

Questo è un esempio di un calcolo in python dei giorni lavorativi (lunedì venerdì) per anno 2023, escludendo le feste se capitano dal lunedì al venerdì. La Pasquetta e il S.Patrono sono variabili ma le altre sono fisse: 1 e 6 gennaio, 10 aprile pasquetta per il 2023, 25 aprile, 1 maggio, 2 giugno, 29 giugno (S.Patrono a Roma), 15 agosto, 1 novembre, 8 dicembre, 25 e 26 dicembre. Il secondo script è parziale per la scrittura del mese e dei giorni. Sostitutendo l'anno si potranno avere altri risultati, ma ricordarsi di inserire il giorno di Pasquetta corretto. Basta copiare gli script in un qualsiasi editor online per eseguire una verifica.

#calcolo del numero di giorni lavorativi all'anno, per esempio il 2023
from datetime import date, timedelta

def count_weekdays_excluding_holidays(year, holidays):
    start_date = date(year, 1, 1)
    end_date = date(year, 12, 31)
    total_weekdays = 0

    holidays_set = set(date(year, int(d.split('/')[1]), int(d.split('/')[0])) for d in holidays)

    current_date = start_date
    while current_date <= end_date:
        if current_date.weekday() < 5 and current_date not in holidays_set:
            total_weekdays += 1
        current_date += timedelta(days=1)

    return total_weekdays

# Festività 2023
holidays_2023 = ["1/1", "6/1", "10/4", "25/4", "1/5", "2/6", "29/6",
"15/8", "1/11", "8/12", "25/12", "26/12"]

print(count_weekdays_excluding_holidays(2023, holidays_2023))

#-------------------------------------------------------------------------------------

#calcolo del numero di giorni lavorativi all'anno per mese, in questo caso il 2023, con scrittura del mese e numero giorni
from datetime import date, timedelta
import calendar

def monthly_working_days(year, holidays):
    monthly_days = {}

    holidays_set = set(date(year, int(d.split('/')[1]), int(d.split('/')[0])) for d in holidays)

    for month in range(1, 13):
        total_days = 0
        for day in range(1, calendar.monthrange(year, month)[1] + 1):
            current_date = date(year, month, day)
            if current_date.weekday() < 5 and current_date not in holidays_set:
                total_days += 1
        month_name = calendar.month_name[month]
        monthly_days[month_name] = total_days

    return monthly_days

# Festivi
holidays_2023 = ["1/1", "6/1", "10/4", "25/4", "1/5", "2/6", "29/6", "15/8", "1/11", "8/12", "25/12", "26/12"]
monthly_working_days_2023 = monthly_working_days(2023, holidays_2023)
print(monthly_working_days_2023)

#Risultato: {'January': 21, 'February': 20, 'March': 23, 'April': 18, 'May': 22, 
'June': 20, 'July': 21, 'August': 22, 'September': 21, 'October': 22, 'November': 21, 'December': 18}