Excel-datumverschil is vier jaar: kijk eerst naar het datumsysteem van de werkmap
iso_dates bestuurt de datumserialisatiemethode in het bestand en verandert de datetime in het geheugen niet automatisch in een string. Het serienummer van de datum vereist het tijdperk van de werkmap; hier vergelijken we de twee datumsystemen en controleren we de opgeslagen XML- en terugleeswaarden.
Excel exporteert datums die met vier jaar zijn verschoven, en in de meeste gevallen ligt het probleem bij het datumsysteem van de werkmap, niet bij de gegevens zelf. Geschreven voor ontwikkelaars en datamensen die verantwoordelijk zijn voor rapportexports, ETL-scripts of platformonafhankelijke uitwisseling van Excel-bestanden. Wanneer u situaties tegenkomt zoals algemene datumverschuiving, getallen die niet als datums kunnen worden weergegeven, gegevensafwijkingen rond 1900, enz., kunt u eerst het probleem oplossen in de volgorde van dit artikel.
Na het lezen van dit artikel begrijpt u het verschil tussen de twee datumsystemen van 1900 en 1904, weet u hoe u workbook.epoch moet lezen om het systeem te bevestigen dat door de huidige werkmap wordt gebruikt, en beheerst u de acceptatiemethode van het controleren van XML en het teruglezen van waarden na het opslaan. De code en tabellen in dit artikel zijn geïllustreerd met synthetische voorbeelden, geschikt als checklist voordat u met echte documenten gaat werken.
Wat moet ik doen als de Excel-datum vier jaar verschilt? Conclusie in één zin
Lees eerst de workbook.epoch van de werkmap en bevestig het datumsysteem voordat u gaat converteren; Problemen met de grensdatum en tijdzone worden afzonderlijk afgehandeld.
| jouw situatie | Aanbevolen praktijken | reden |
|---|---|---|
| De geëxporteerde datum wordt in totaal ongeveer 1462 dagen gecompenseerd | Lees eerst workbook.epoch om het datumsysteem van de werkmap te bevestigen | Het verschil tussen de systemen uit 1900 en 1904 is 1462 dagen, en onjuiste aannames aan de leeszijde zullen ervoor zorgen dat alle serienummers verkeerd worden geïnterpreteerd |
| De cel is een getal, maar kan niet als datum worden weergegeven | Controleer en voltooi het number_format-datumformaatmasker | Wanneer het numerieke type correct is, zullen ontbrekende formaten weergaveafwijkingen veroorzaken. |
| Data vóór maart 1900 of 29-02-1900 verschijnen in de gegevens | Markeer als ongeldig of overgedragen naar handmatige beoordeling, behoud het originele serienummer | Deze datum bestaat niet in de Gregoriaanse kalender en mag niet worden gedwongen om te converteren |
datetime met tijdzone moet worden geschreven | Strip tzinfo na uniforme conversie naar UTC | Excel biedt geen ondersteuning voor het opslaan van tijdzones, alle tijden zijn lokale tijd zonder dat u zich hiervan bewust bent |
| Bestanden moeten tussen platforms worden uitgewisseld | Geef het datumsysteem expliciet aan | De standaardinstellingen van de ontvanger zijn anders, wat een stille offset kan veroorzaken |
Verschillen tussen datumsystemen uit 1900 en 1904
Een datum in een XLSX-bestand is in wezen een serienummer met drijvende komma, en de betekenis ervan hangt volledig af van het datumsysteem waaraan de werkmap is gekoppeld. De XLSX-specificatie staat twee basistijdvakken toe:
- 1900 Datumsysteem: standaard gebruikt door Windows, serienummer 1 staat voor 1900-01-01
- 1904 Date System: standaard gebruikt op vroege Macs, serienummer 0 staat voor 1904-01-01
Er is een vaste verschuiving van 1462 dagen tussen de twee, wat de belangrijkste bron is van het "datumverschil van vier jaar". Bovendien kent het systeem van 1900 een historisch probleem: het beschouwt 1900 ten onrechte als een schrikkeljaar, waardoor de niet-bestaande datum 29-02-1900 in Excel wordt gelegaliseerd.
Kernvergelijking
| project | Datumsysteem uit 1900 | Datumsysteem uit 1904 |
|---|---|---|
| Beginpunt van serienummer | Serienummer 1 komt overeen met 1900-01-01 | Serienummer 0 komt overeen met 1904-01-01 |
| Veelvoorkomende standaardbronnen | Windows | Vroege Mac |
| gecompenseerd door een ander systeem | 1462 dagen verschil | 1462 dagen verschil |
| speciale kwesties | 1900 wordt aangezien voor een schrikkeljaar, maar bestaat op 29-02-1900 | Dit artikel behandelt dergelijke kwesties niet |
Waarom gegevens van vóór 1900 speciale aandacht behoeven
Als je te maken hebt met historische gegevens van vóór maart 1900, kan de datetime-module van Python niet rechtstreeks 29 februari weergeven. Volgens de officiële openpyxl-documentatie zal de bibliotheek, om compatibel te zijn met het gedrag van Excel, deze uitzondering simuleren bij het lezen van datums in januari en februari onder het 1900-systeem, maar 29-02-1900 zelf kan niet worden omgezet in een geldig Python datetime-object.
Voor de meeste moderne bedrijfsgegevens is het van belang om te identificeren welk systeem de huidige werkmap gebruikt en dit expliciet te declareren bij het uitwisselen van bestanden tussen platforms om stille drift aan de ontvangende kant als gevolg van verschillende standaardinstellingen te voorkomen.
Synthesevoorbeeld: grensinvoer en verwerkingsmethoden
Om het probleem te illustreren construeren we een synthetisch scenario: een rapport dat door een financieel systeem wordt geëxporteerd, gebruikt het datumsysteem van 1904, maar het stroomafwaartse ETL-script ontleedt het standaard volgens het systeem van 1900.
Afhandeling van fouten of grensinvoer:
- Als het ingevoerde serienummer 60 is en de werkmap voor het 1900-systeem is, komt dit overeen met het fictieve 29-02-1900 in Excel. Python's eigen
datetimegooitValueError. - Op dit moment mag de uitzondering niet worden geforceerd, maar moet de uitzondering worden opgevangen en geregistreerd als de oorspronkelijke waarde of het speciale merkteken, omdat de datum niet bestaat in de Gregoriaanse kalender.
- Als een
datetime-object met tijdzone-informatie wordt doorgegeven voor schrijven, zal openpyxl de tijdzone niet automatisch converteren, maar vereist dat de tzinfo eerst wordt verwijderd, anders kan er een schrijffout of fout optreden. - Excel zelf ondersteunt geen tijdzoneopslag en alle tijden zijn zonder medeweten lokale tijd.
Datumsysteemdetectie en veilige conversiecode
Het volgende voorbeeld laat zien hoe u veilig omgaat met datumsysteemverschillen in het geheugen. De code is alleen bedoeld voor logische demonstratie en voert niet het daadwerkelijke lezen en schrijven van bestanden uit. Het moet worden uitgevoerd in uw eigen vergrendelde afhankelijkheidsomgeving. Openpyxl >= 3.1.0 wordt aanbevolen. De voorbeelden omvatten geen netwerkverzoeken of bewerkingen voor het overschrijven van bestanden; alle beweringen zijn gebaseerd op synthetische gegevens.
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
Acceptatiecriteria en grenzen voor handmatige beoordeling
| Observeer verschijnselen | invoer- of randvoorwaarden | verwachte output of verwerkingsbeslissing | Of automatisering van toepassing is |
|---|---|---|---|
| Alle datums worden uniform gecompenseerd met 1462 dagen | wb.epoch is inconsistent met analytische aannames | Lees wb.epoch en converteer het volgnummer opnieuw | Ja |
| 29-02-1900 verschijnt in de gegevens | 1900 systeem met serienummer 60 | Gemarkeerd als ongeldige datum, behoud origineel serienummer 60 | Nee, u moet de zakelijke betekenis handmatig bevestigen |
| Een deel van de tijd ontbreekt of is misplaatst | Voer datetime in met tzinfo | Converteer uniform naar UTC en strip vervolgens tzinfo om te schrijven | onderdeel, moet u de doeltijdzone handmatig definiëren |
| Cel geeft het getal weer, maar is opgemaakt als datum | Het numerieke type is correct, maar number_format ontbreekt | Controleer en vul het datumformaatmasker in | Ja |
| Historische data (vóór 1900-01-01) worden abnormaal weergegeven | Datum eerder dan 01-01-1900 | Gebruik in plaats daarvan tekstopslag of een speciale historische database | Nee, XLSX is niet geschikt voor dit scenario |
Opgemerkt moet worden dat de codedemonstratie alleen de juistheid van de conversielogica verifieert en niet gelijk is aan het end-to-end-effect. Echte bestanden kunnen meerdere datumnotaties, voorwaardelijke notaties of datums bevatten die zijn gegenereerd door formules, waarvoor extra parseerlagen nodig zijn. Wanneer u data vóór maart 1900 tegenkomt, samenwerkingsgegevens tussen verschillende tijdzones of niet-standaard kalenders (zoals de maankalender, het fiscale jaar), moet u een handmatig beoordelingsproces starten en mogen geautomatiseerde scripts geen ongeoorloofde correcties aanbrengen.
🎯 Welke methode is geschikt voor jou?
Als u de datum uit het exportbestand wilt lezen
Lees eerst workbook.epoch, bevestig het datumsysteem en beslis vervolgens of u het serienummer opnieuw wilt converteren.
Als uw gegevens betrekking hebben op data vóór maart 1900
Markeer de records met betrekking tot 29-02-1900 als ongeldig, behoud het originele serienummer en overhandig het aan handmatige bevestiging van de zakelijke betekenis.
Als u tijd met tijdzone in Excel wilt schrijven
Converteer eerst uniform naar UTC en verwijder vervolgens tzinfo; de doeltijdzone moet handmatig worden gedefinieerd.
Als u bestanden wilt uitwisselen met andere systemen
Geef het datumsysteem expliciet aan en valideer de terugleesdatumwaarden aan de ontvangende kant.
❓ Veelgestelde vragen (FAQ)
1. Waarom wordt de geëxporteerde datum ongeveer vier jaar verschoven?
Een veel voorkomende oorzaak is dat het datumsysteem van de werkmap inconsistent is met de aannames aan de leeskant. Het verschil tussen de twee systemen van 1900 en 1904 bedraagt 1462 dagen.
2. Zal iso_dates datetime automatisch in een string veranderen?
Zal niet. iso_dates bestuurt alleen de datumserialisatiemethode in het bestand en converteert datetime in het geheugen niet automatisch naar een string.
3. Waarom kan 29-02-1900 niet worden geconverteerd naar DateTime in Python?
1900 Het systeem beschouwt 1900 ten onrechte als een schrikkeljaar, waardoor 29-02-1900 wel bestaat in Excel, maar de dag bestaat niet in de Gregoriaanse kalender. Python's datetime gooit ValueError, in welk geval de originele numerieke waarde of de speciale vlag moet worden vastgelegd.
4. Hoe schrijf ik datetime met tijdzone in Excel?
Excel ondersteunt het opslaan van tijdzones niet. Het moet eerst uniform worden geconverteerd naar UTC en vervolgens worden ontdaan van tzinfo voordat het wordt geschreven; openpyxl voltooit niet automatisch de tijdzoneconversie.
📝 Samenvatting
Problemen met datumverschuiving komen meestal voort uit het datumsysteem van de werkmap. Als u eerst workbook.epoch bevestigt voordat u converteert, kunt u de meeste stille fouten voorkomen. Problemen met grensdatum en tijdzone moeten worden doorverwezen naar menselijke beoordeling.
Referenties en volgende stappen
- openpyxl officiële datum- en tijddocumentatie: https://openpyxl.readthedocs.io/en/stable/datetime.html
- Opmerking van Microsoft over het datumsysteem 1900/1904: https://docs.microsoft.com/en-us/office/troubleshoot/excel/1900-and-1904-date-system
- Microsoft-uitleg over de schrikkeljaarbug uit 1900: https://docs.microsoft.com/en-us/office/troubleshoot/excel/wrongly-assumes-1900-is-leap-year
Volgende stap: Selecteer een ongevoelig Excel-voorbeeld waarvoor u toestemming heeft om te gebruiken, voer de bovenstaande tijdperkdetectiecode uit en bevestig of het datumsysteem consistent is met uw verwerkingslogica. Als er inconsistenties worden gevonden, pas dan de conversieparameters aan voordat u vertaalresultaten genereert.
Gebruik deze checklist voor documentvertaling
Bepaal eerst welke inhoud tekst is, dat wil zeggen formule- en bedrijfscodering, en vertaal vervolgens de tabel. Controle na de vertaling bevestigt niet alleen of het Chinees naar de doeltaal is omgezet, maar bevestigt ook dat formules, identificatiegegevens en referentierelaties niet zijn gewijzigd.
OmniDoc (productportaal) biedt een documentvertalingsportaal in meerdere formaten, en de officiële website introduceert OCR-, woordenlijst- en tweetalige vergelijkingsfuncties. Voor teams die rechtstreeks vanuit de bestanden willen werken, is dit een pad dat de moeite waard is om te evalueren met praktijkvoorbeelden. Gebruik ongevoelige bestanden waarvoor u toestemming heeft om te uploaden, en gebruik de controle-items in dit artikel om de resultaten te bekijken. In dit artikel wordt niet beweerd dat OmniDoc de open source-bibliotheken of interne algoritmen in het artikel gebruikt, noch worden er voorbeelden gebruikt ter vervanging van het testen van productprestaties.


