Rozdíl v datech Excelu je čtyři roky: nejprve se podívejte na datový systém sešitu

iso_dates řídí metodu serializace data v souboru a automaticky nepřevádí datum a čas v paměti na řetězec. Pořadové číslo data vyžaduje epochu sešitu; zde porovnáváme dva datové systémy a kontrolujeme uložené hodnoty XML a readback.

Excel exportuje data posunutá o čtyři roky a ve většině případů je problém s datovým systémem sešitu, nikoli s daty samotnými. Napsáno pro vývojáře a datové lidi zodpovědné za exporty reportů, ETL skripty nebo meziplatformní výměnu souborů Excelu. Když narazíte na situace, jako je celkový posun data, čísla, která nelze zobrazit jako data, datové anomálie kolem roku 1900 atd., můžete nejprve odstranit potíže v pořadí podle tohoto článku.

Po přečtení tohoto článku pochopíte rozdíl mezi dvěma datovými systémy z roku 1900 a 1904, budete vědět, jak číst workbook.epoch pro potvrzení systému používaného aktuálním sešitem, a zvládnete akceptační metodu kontroly XML a zpětného čtení hodnot po uložení. Kód a tabulky v tomto článku jsou ilustrovány syntetickými vzorky, které jsou vhodné jako kontrolní seznam před prací se skutečnými dokumenty.

Co mám dělat, pokud se datum aplikace Excel liší o čtyři roky? Závěr jednou větou

Nejprve si přečtěte workbook.epoch sešitu a před převodem potvrďte datový systém; Problémy s hraničním datem a časovým pásmem se řeší samostatně.

vaší situaciDoporučené postupydůvod
Datum exportu je celkově posunuto o přibližně 1462 dníNejprve si přečtěte workbook.epoch a potvrďte systém dat sešituRozdíl mezi systémy 1900 a 1904 je 1462 dní a nesprávné předpoklady na straně čtení způsobí, že všechna sériová čísla budou nesprávně interpretována.
Buňka je číslo, ale nelze ji zobrazit jako datumZkontrolujte a vyplňte masku formátu data number_formatKdyž je číselný typ správný, chybějící formáty způsobí abnormality zobrazení.
V datech se objevují data před březnem 1900 nebo 1900-02-29Označte jako neplatné nebo převedené na ruční kontrolu, ponechte si původní sériové čísloToto datum v gregoriánském kalendáři neexistuje a nemělo by být nuceno ke konverzi
Je třeba napsat datetime s časovou zónouOdstraňte tzinfo po jednotné konverzi na UTCExcel nepodporuje ukládání časových pásem, všechny časy jsou místní čas bez vědomí
Soubory je třeba vyměňovat mezi platformamiExplicitně deklarujte datový systémVýchozí nastavení přijímače se liší, což může způsobit tichý offset

Rozdíly mezi datovými systémy z roku 1900 a 1904

Datum v souboru XLSX je v podstatě sériové číslo s plovoucí desetinnou čárkou a jeho význam zcela závisí na datovém systému, ke kterému je sešit vázán. Specifikace XLSX umožňuje dvě základní epochy:

  • 1900 Date System: používá Windows ve výchozím nastavení, sériové číslo 1 představuje 1900-01-01
  • 1904 Date System: Používá se ve výchozím nastavení na starších počítačích Mac, sériové číslo 0 představuje 1904-01-01

Mezi těmito dvěma je pevný posun 1462 dní, což je hlavní zdroj „datového rozdílu čtyř let". Systém 1900 má navíc historický problém: nesprávně považuje rok 1900 za přestupný rok, což způsobuje, že neexistující datum 1900-02-29 je v Excelu legalizováno.

Srovnání jádra

projektdatový systém 1900datový systém 1904
Počáteční bod sériového číslaSériové číslo 1 odpovídá 1900-01-01Sériové číslo 0 odpovídá 1904-01-01
Běžné výchozí zdrojeWindowsRaný Mac
Offset z jiného systémuRozdíl 1 462 dníRozdíl 1 462 dní
Speciální číslaMylně počítající rok 1900 jako přestupný rok, existuje 29. 2. 1900Tento článek se takovým otázkám nezabývá

Proč data z 1900 let daleko vyžadují zvláštní opatrnost

Pokud pracujete s historickými daty před březnem 1900, moduldatetime v Pythonu nemůže přímo reprezentovat 29. únor. Podle oficiální dokumentace OpenPyxl, aby se podpořilo chování Excelu, knihovna simuluje tuto výjimku při čtení dat leden a únor na systému 1900, ale samotná verze 1900-02-29 ji nemůže převést na platný Python datetime objekt.

U většiny moderních firemních dat je klíčové identifikovat, jaký systém aktuální pracovní sešit používá, a explicitně jej deklarovat při výměně souborů mezi platformami, aby se předešlo tichým offsetům způsobeným odlišnými výchozími nastaveními příjemce.

Příklad syntézy: Metody vstupu a zpracování hranic

Pro ilustraci problému si sestavme syntetický scénář: finanční systém exportuje zprávy pomocí datového systému 1904, ale skripty ETL v downstream standardně parsují systém z roku 1900.

Řešení chyb nebo hraničních vstupů:

  1. Pokud zadáte sériové číslo 60 a pracovní sešit je systém 1900, odpovídá to fiktivnímu 1900-02-29 v Excelu. Nativní python datetime hází ValueError.
  2. V tomto bodě nenuťte konverzi; místo toho anomálii zachyťte a zaznamenejte ji jako původní hodnotu nebo speciální značku, protože toto datum v gregoriánském kalendáři neexistuje.
  3. Pokud je objekt datetime s informacemi o časovém pásmu předán a zapsán, openpyxl časové pásmo automaticky nepřevede, ale nejprve odstraní tzinfo; jinak mohou nastat chyby nebo chyby při zápisu.
  4. Excel sám o sobě nepodporuje ukládání v časovém pásmu; veškerý čas je nepostřehnutelný lokální čas.

Kód detekce datového systému a konverze bezpečnosti

Následující příklad ukazuje, jak bezpečně zvládat rozdíly v datových systémech v paměti. Kód slouží pouze k logické demonstraci a ve skutečnosti nečte ani nezapisuje soubory. Musí běžet ve vašem vlastním uzamčeném závislostním prostředí. Openpyxl >= doporučuje se verze 3.1.0. Příklad nezahrnuje síťové požadavky ani operace přepisování souborů; všechny aserce jsou založeny na syntetických datech.

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

Kritéria přijetí a hranice manuálního hodnocení

Pozorujte tento jevVstupní nebo okrajové podmínkyOčekávaný výstup nebo rozhodnutí o zpracováníZda je automatizace vhodná
Všechny termíny jsou jednotně posunuty o 1462 dníwb.epoch neodpovídá analytickému předpokladuPo přečtení wb.epoch převeďte sériové čísloAno
1900-02-29 se objevilo v datechSystém z roku 1900 se sériovým číslem 60Označte jako neplatné datum, přičemž si zachováte původní sériové číslo 60Ne, význam podnikání musí být ověřen ručně
Čas je částečně ztracen nebo nesprávně zarovnanýZadejte datetime s tzinfoPo rovnoměrném převodu na UTC je tzinfo odstraněna a znovu zapsánaNěkteré vyžadují ruční určení cílového časového pásma
Buňky zobrazují čísla, ale jsou ve formátu datTyp hodnoty je správný, ale number_format chybíZkontrolujte a dokončte masku formátu dataAno
Historická data (před 1. 1. 1. 1900) vykazují anomálieDatum před 1. 1. 1900Přechod na ukládání textu nebo specializované historické databázeNe, XLSX pro tento scénář není vhodný

Všimněte si, že demonstrace kódu pouze ověřuje správnost konverzní logiky a nepředstavuje efekt od začátku do konce. Skutečné soubory mohou kombinovat více formátů dat, podmíněných formátů nebo dat generovaných vzorci, což vše vyžaduje další vrstvy parsování. Při setkání s daty před březnem 1900, daty o spolupráci napříč časovými pásmy nebo nestandardními kalendáři (například lunárními či fiskálními lety) by měly být použity manuální kontrolní procesy a automatizované skripty by neměly být libovolně upravovány.

🎯 Která metoda ti vyhovuje?

Pokud potřebujete přečíst datum z exportního souboru

Nejprve si přečtěte workbook.epoch, ověřte datový systém a pak se rozhodněte, zda převést sériové číslo.

Pokud vaše data zahrnují data před březnem 1900

Označte záznam týkající se 29. 2. 1900 jako neplatný, zachovejte původní sériové číslo a předejte ho manuálu k potvrzení obchodního významu.

Pokud potřebujete zapsat čas s časovými pásmy do Excelu

Nejprve rovnoměrně převést do UTC, poté odstranit tzinfo; Cílové časové pásmo je třeba definovat ručně.

Pokud chceš vyměňovat soubory s jinými systémy

Výslovně deklaruje datový systém a ověřuje hodnotu data, která má být přečtena zpět na přijímající straně.

❓ Často kladené otázky (FAQ)

1. Proč je datum exportu celkově posunuté asi o čtyři roky?

Častým důvodem je, že datový systém v pracovním sešitu neodpovídá předpokladům na straně čtení. Mezi systémy z roku 1900 a 1904 je mezera 1 462 dní.

2. iso_dates: Bude automaticky převádět datetime na řetězec?

Ne. iso_dates ovládá pouze metodu datové serializace v souboru a automaticky nepřevádí datetime z paměti na řetězce.

3. Proč nelze převést datum 29. 2. 1900 na Python datový čas?

Systém z roku 1900 mylně považuje rok 1900 za přestupný rok, což způsobuje, že rok 1900-02-29 existuje v Excelu, ale ne v gregoriánském kalendáři. Pythonův datetime hodí ValueError, který by měl zaznamenat původní hodnotu nebo speciální tag.

4. Jak byste měli psát datetime s časovým pásmem v Excelu?

Excel nepodporuje ukládání časových pásem. Nejprve by měla být rovnoměrně převedena na UTC, poté zapsána po odstranění tzinfo; OpenPyxl automaticky nepřevádí časová pásma.

📝 Shrnutí

Problémy s posunem data obvykle vznikají kvůli datovému systému v pracovním sešitu. Před převodem potvrďte workbook.epoch, což může většině tichých chyb předejít. Otázky ohledně hranic, dat a časových pásem by měly být předány k ruční kontrole.

Zkušenost nyní: Nahrajte svůj dokument a začněte s překladem, přičemž zachováte původní formátování

Odkazy a další kroky

  • Oficiální dokument OpenPyxl o datu a čase: https://openpyxl.readthedocs.io/en/stable/datetime.html
  • Microsoft Vysvětlení datového systému 1900/1904: https://docs.microsoft.com/en-us/office/troubleshoot/excel/1900-and-1904-date-system
  • Microsoft Vysvětlení chyby přestupného roku 1900: https://docs.microsoft.com/en-us/office/troubleshoot/excel/wrongly-assumes-1900-is-leap-year

Dále: Vyberte si úzkostlivý vzorek Excelu, ke kterému máte přístup, spusť výše uvedený kód detekce epoch a ověřte, zda jeho datový systém odpovídá vaší logice zpracování. Pokud se zjistí nesrovnalosti, upravte parametry převodu před generováním přeloženého výstupu.

Použijte tento kontrolní seznam pro překlad dokumentů

Nejprve rozhodni, který obsah je text, který je vzorec a obchodní kód, a pak přelož tabulku. Kontrola po překladu nejen potvrzuje, zda byla čínština převedena do cílového jazyka, ale také zajišťuje, že vzorce, identifikátory a citační vztahy nebyly změněny.

OmniDoc (produktový záznam) poskytuje portály pro překlad dokumentů ve více formátech a jeho oficiální webové stránky představují OCR, slovníčky a bilingvní referenční funkce. Pro týmy, které chtějí začít přímo ze souborů, je to cesta, kterou stojí za to vyhodnotit na skutečných vzorkech. Použijte anonymizovaný soubor, který jste povolili k nahrání a ověření výsledků pomocí kontrolního seznamu v tomto článku. Tento článek netvrdí, že OmniDoc používá open-source knihovny nebo interní algoritmy zmíněné v článku, ani nenahrazuje testování výkonu produktu příklady.

Aktualizováno 2026-11-13