I file Excel memorizzano le date come numeri seriali, rappresentando il numero di giorni trascorsi dal 1 gennaio 1900 (sistema Windows) o dal 1 gennaio 1904 (sistema Mac). Per lavorare correttamente con le date in Python, è necessario convertire questi numeri in oggetti datetime.
1. Installare la Libreria necessaria
La libreria openpyxl è comunemente utilizzata per leggere i file Excel (.xlsx). Per installarla:
pip install openpyxl2. Esempio di Conversione
Nel seguente esempio, leggeremo un file Excel e convertiremo i valori delle celle contenenti date nel formato standard ISO (YYYY-MM-DD).
from openpyxl import load_workbook
from datetime import datetime, timedelta
# Carica il file Excel
workbook = load_workbook('esempio.xlsx')
sheet = workbook.active
# Funzione per convertire numero Excel in data
def excel_date_to_datetime(excel_serial, date_system='windows'):
    if date_system == 'windows':
        start_date = datetime(1899, 12, 30)  # Excel considera 1900 come anno bisestile
    elif date_system == 'mac':
        start_date = datetime(1904, 1, 1)
    else:
        raise ValueError("Sistema non valido. Usa 'windows' o 'mac'.")
    return start_date + timedelta(days=excel_serial)
# Estrae e converte le date dalla prima colonna
for row in sheet.iter_rows(min_row=2, max_col=1, values_only=True):
    excel_value = row[0]
    if isinstance(excel_value, (int, float)):
        date = excel_date_to_datetime(excel_value)
        print(date.strftime('%Y-%m-%d'))
    else:
        print(f'Valore non convertibile: {excel_value}')
3. Considerazioni
- Verifica sempre il sistema di riferimento delle date (Windows o Mac).
- Le celle con valori non numerici o già in formato datetimenon devono essere convertite.
- Excel considera il 1900 come anno bisestile, il che introduce un errore di 1 giorno per date anteriori a marzo 1900.
Conclusione
Con Python è possibile convertire facilmente le date in formato Excel in oggetti datetime standard. Questo consente di gestire e manipolare correttamente le date in applicazioni e analisi successive.