La differenza tra le date di Excel è di quattro anni: prima guarda il sistema di data della cartella di lavoro

iso_dates controlla il metodo di serializzazione della data nel file e non trasforma automaticamente il datetime nella memoria in una stringa. Il numero di serie della data richiede l'epoca della cartella di lavoro; qui confrontiamo i due sistemi di data e controlliamo l'XML salvato e i valori di rilettura.

Excel esporta date con uno spostamento di quattro anni e nella maggior parte dei casi il problema riguarda il sistema di data della cartella di lavoro, non i dati stessi. Scritto per sviluppatori e addetti ai dati responsabili delle esportazioni di report, script ETL o scambio multipiattaforma di file Excel. Quando si verificano situazioni come uno spostamento generale della data, numeri che non possono essere visualizzati come date, anomalie dei dati intorno al 1900, ecc., è possibile innanzitutto risolvere il problema seguendo l'ordine di questo articolo.

Dopo aver letto questo articolo, capirai la differenza tra i due sistemi di data del 1900 e del 1904, saprai come leggere workbook.epoch per confermare il sistema utilizzato dalla cartella di lavoro corrente e padroneggerai il metodo di accettazione per controllare XML e rileggere i valori dopo il salvataggio. Il codice e le tabelle presenti in questo articolo sono illustrati con esempi sintetici, adatti come checklist prima di lavorare con documenti reali.

Cosa devo fare se la data di Excel è diversa di quattro anni? Conclusione di una frase

Prima leggere il workbook.epoch della cartella di lavoro e confermare il sistema di data prima della conversione; i problemi relativi alla data limite e al fuso orario vengono gestiti separatamente.

la tua situazionePratiche consigliatemotivo
La data di esportazione è complessivamente compensata di circa 1462 giorniLeggere prima workbook.epoch per confermare il sistema di data della cartella di lavoroLa differenza tra i sistemi 1900 e 1904 è di 1462 giorni e ipotesi errate sul lato della lettura causeranno un'errata interpretazione di tutti i numeri di serie
La cella è un numero ma non può essere visualizzata come dataControllare e completare la maschera del formato data number_formatQuando il tipo numerico è corretto, i formati mancanti causeranno anomalie di visualizzazione.
Nei dati compaiono date precedenti al marzo 1900 o al 29-02-1900Contrassegna come non valido o trasferito alla revisione manuale, conserva il numero di serie originaleQuesta data non esiste nel calendario gregoriano e non dovrebbe essere forzata la conversione
È necessario scrivere datetime con il fuso orarioElimina tzinfo dopo la conversione unificata in UTCExcel non supporta la memorizzazione dei fusi orari, tutti gli orari sono l'ora locale senza consapevolezza
I file devono essere scambiati tra piattaformeDichiarare esplicitamente il sistema di dateLe impostazioni predefinite del ricevitore sono diverse, il che potrebbe produrre un offset silenzioso

Differenze tra i sistemi di data 1900 e 1904

Una data in un file XLSX è essenzialmente un numero di serie in virgola mobile e il suo significato dipende interamente dal sistema di data a cui è legata la cartella di lavoro. La specifica XLSX consente due epoche di base:

  • Sistema data 1900: utilizzato da Windows per impostazione predefinita, il numero di serie 1 rappresenta 1900-01-01
  • Sistema data 1904: utilizzato per impostazione predefinita sui primi Mac, il numero di serie 0 rappresenta 1904-01-01

Tra i due esiste una differenza fissa di 1462 giorni, che è la fonte principale della "differenza di data di quattro anni". Inoltre, il sistema 1900 presenta un problema storico: considera erroneamente il 1900 come un anno bisestile, causando la legalizzazione in Excel della data inesistente 1900-02-29.

Confronto fondamentale

progettoSistema di data 1900Sistema di date del 1904
Punto di partenza del numero di serieIl numero di serie 1 corrisponde a 1900-01-01Il numero di serie 0 corrisponde al 1904-01-01
Fonti predefinite comuniWindowsPrimi Mac
Offset rispetto a un altro sistemaUna differenza di 1.462 giorniUna differenza di 1.462 giorni
Numeri specialiContando erroneamente il 1900 come anno bisestile, esiste il 29-02-1900Questo articolo non affronta tali questioni

Perché i dati di 1900 anni lontani richiedono particolare cautela

Se si lavorano dati storici precedenti a marzo 1900, il modulo datetime di Python non può rappresentare direttamente il 29 febbraio. Secondo la documentazione ufficiale di OpenPyxl, per supportare il comportamento di Excel, la libreria simula questa eccezione quando si leggono le date di gennaio e febbraio sul sistema 1900, ma il 29-02-1900 non può convertirla in un oggetto datetime valido in Python.

Per la maggior parte dei dati aziendali moderni, la chiave è identificare quale sistema utilizza il workbook attuale e dichiararlo esplicitamente durante lo scambio di file tra piattaforme per evitare offset silenziosi causati da diverse impostazioni predefinite sul destinatario.

Esempio di sintesi: metodi di input e elaborazione al confine

Per illustrare il problema, costruiamo uno scenario sintetico: un report esportato da un sistema finanziario utilizza il sistema di data 1904, ma lo script ETL downstream lo analizza secondo il sistema 1900 per impostazione predefinita.

Gestione degli errori o degli input di confine:

  1. Se il numero di serie immesso è 60 e la cartella di lavoro è per il sistema 1900, corrisponde al 29-02-1900 fittizio in Excel. Il datetime nativo di Python genera ValueError.
  2. A questo punto, l'eccezione non dovrebbe essere forzata, ma dovrebbe essere colta e registrata come valore originale o segno speciale, perché la data non esiste nel calendario gregoriano.
  3. Se un oggetto datetime con informazioni sul fuso orario viene passato per la scrittura, openpyxl non convertirà automaticamente il fuso orario, ma richiederà che tzinfo venga prima rimosso, altrimenti potrebbe verificarsi un errore di scrittura o un errore.
  4. Excel stesso non supporta l'archiviazione del fuso orario e tutti gli orari sono l'ora locale senza consapevolezza.

Data System Detection e Codice di Conversione di Sicurezza

L'esempio seguente mostra come gestire in modo sicuro le differenze del sistema di data in memoria. Il codice è solo per dimostrazione logica e non esegue la lettura e la scrittura effettiva del file. Deve essere eseguito nel proprio ambiente di dipendenza bloccato. Si consiglia Openpyxl >= 3.1.0. Gli esempi non includono richieste di rete o operazioni di sovrascrittura di file, tutte le asserzioni si basano su dati sintetici.

from datetime import datetime
from io import BytesIO
from zipfile import ZipFile
from openpyxl import Workbook, load_workbook
from openpyxl.utils.datetime import from_excel, CALENDAR_MAC_1904, CALENDAR_WINDOWS_1900
assert from_excel(1, CALENDAR_MAC_1904) == datetime(1904, 1, 2)
assert from_excel(1, CALENDAR_WINDOWS_1900) == datetime(1900, 1, 1)
wb = Workbook()
wb.epoch = CALENDAR_MAC_1904
wb.iso_dates = True
value = datetime(2026, 9, 26, 12, 30)
wb.active["A1"] = value
assert wb.active["A1"].value == value
out = BytesIO()
wb.save(out)
with ZipFile(BytesIO(out.getvalue())) as z:
    xml = z.read("xl/worksheets/sheet1.xml")
    assert b't="d"' in xml and b"2026-09-26T12:30:00" in xml
restored = load_workbook(BytesIO(out.getvalue()))
assert restored.active["A1"].value == value
assert restored.epoch == CALENDAR_MAC_1904

Criteri di accettazione e limiti della revisione manuale

Osserva il fenomenocondizioni di ingresso o al contornoDecisioni di output o di elaborazione atteseSe l'automazione è applicabile
Tutte le date sono uniformemente spostate di 1462 giorniwb.epoch non corrisponde all'assunzione analiticaDopo aver letto wb.epoch, riconvertire il numero di serieSÌ
Il 29-02-1900 apparve nei datiSistema 1900 con numero di serie 60Contrassegnato come data non valida, conservare il numero di serie originale 60No, è necessario confermare manualmente il significato commerciale
Il tempo si perde o è disallineato parzialmenteInserisci datetime con tzinfoConverti in UTC in modo uniforme e quindi rimuovi tzinfo per la scritturaAlcuni richiedono di definire manualmente il fuso orario target
La cella visualizza il numero ma formattato come dataIl tipo di valore è corretto ma manca number_formatControlla e completa le maschere del formato della dataSì
Le date storiche (precedenti al 1900-01-01) mostrano anomalieData precedente al 1900-01-01Passa a archiviazione di testo o a database storici dedicatiNo, XLSX non è adatto a questo scenario

Va notato che la dimostrazione del codice verifica solo la correttezza della logica di conversione e non equivale all'effetto end-to-end. I file reali possono contenere più formati di data, formati condizionali o date generate da formule, che richiedono livelli aggiuntivi di analisi. Quando incontri date precedenti al marzo 1900, dati di collaborazione tra fusi orari o calendari non standard (come calendario lunare, anno fiscale), dovresti avviare un processo di revisione manuale e gli script automatizzati non dovrebbero apportare correzioni non autorizzate.

🎯 Quale metodo ti si addice?

Se devi leggere la data dal file di esportazione

Prima leggi workbook.epoch, conferma il sistema di date e poi decidi se riconvertire il numero di serie.

Se i tuoi dati riguardano date precedenti a marzo 1900

Segna il documento relativo al 1900-02-29 come invalido, conserva il numero di serie originale e consegnalo a un manuale per confermare il significato commerciale.

Se è necessario scrivere l'ora con il fuso orario in Excel

Prima convertire uniformemente in UTC, poi rimuovere tzinfo; Il fuso orario target deve essere definito manualmente.

Se vuoi scambiare file con altri sistemi

Dichiarare esplicitamente il sistema di date e convalidare i valori della data di rilettura sul lato ricevente.

❓ Domande Frequenti (FAQ)

1. Perché la data di esportazione è spostata di circa quattro anni?

Una ragione comune è che il sistema di date del quaderno non corrisponde alle ipotesi previste dalla lettura. C'è un intervallo di 1.462 giorni tra i sistemi del 1900 e quello del 1904.

2. iso_dates: Convertirà automaticamente l'ora della data in una stringa?

No. iso_dates controlla solo il metodo di serializzazione della data nel file e non converte automaticamente datetime in memoria in stringa.

3. Perché 1900-02-29 non può essere convertito in Python datetime?

1900 Il sistema considera erroneamente il 1900 come un anno bisestile, facendo sì che in Excel esista il 29-02-1900, ma il giorno non esiste nel calendario gregoriano. datetime di Python lancia ValueError, nel qual caso il valore numerico originale o il flag speciale dovrebbero essere registrati.

4. Come scrivere datetime con fuso orario in Excel?

Excel non supporta la memorizzazione dei fusi orari. Innanzitutto, dovrebbe essere convertito uniformemente in UTC, poi scritto dopo aver rimosso tzinfo; OpenPyXL non converte automaticamente i fusi orari.

📝 Riepilogo

I problemi di offset della data in genere derivano dal sistema di data della cartella di lavoro. Confermare workbook.epoch prima della conversione può evitare la maggior parte degli errori silenziosi. I problemi relativi alla data limite e al fuso orario devono essere sottoposti a revisione umana.

Esperienza ora: carica il tuo documento per iniziare a tradurre, mantenendo la formattazione originale

Riferimenti e passaggi successivi

  • Documento ufficiale di data e ora OpenPyxl: https://openpyxl.readthedocs.io/en/stable/datetime.html
  • Microsoft Spiegazione del sistema di datazione 1900/1904: https://docs.microsoft.com/en-us/office/troubleshoot/excel/1900-and-1904-date-system
  • Spiegazione Microsoft del bug degli anni bisestili del 1900: https://docs.microsoft.com/en-us/office/troubleshoot/excel/wrongly-assumes-1900-is-leap-year

Poi: seleziona un esempio Excel ansioso a cui hai accesso, esegui il codice di rilevamento epoch sopra e conferma se il sistema di date corrisponde alla tua logica di elaborazione. Se vengono riscontrate incongruenze, si aggiustano i parametri di conversione prima di generare il deliverable tradotto.

Usa questa checklist per la traduzione dei documenti

Per prima cosa decidi quale contenuto è testo, quale è formula e codifica aziendale, quindi traduci la tabella. Il controllo post-traduzione non solo conferma se il cinese è stato convertito nella lingua di destinazione, ma conferma anche che formule, identificatori e relazioni di riferimento non sono stati modificati.

OmniDoc (Voce prodotto) offre portali di traduzione documentale multiformato e il suo sito ufficiale introduce OCR, glossari e funzionalità di riferimento bilingue. Per i team che vogliono partire direttamente dai file, questo è un percorso che vale la pena valutare con campioni reali. Si prega di utilizzare il file anonimizzato autorizzato per caricare e verificare i risultati con la checklist in questo articolo. Questo articolo non sostiene che OmniDoc utilizzi le librerie open source o gli algoritmi interni menzionati nell'articolo, né sostituisce i test delle prestazioni del prodotto con esempi.

Aggiornato il 2026-11-13