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ší situaci | Doporučené postupy | dů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šitu | Rozdí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 datum | Zkontrolujte a vyplňte masku formátu data number_format | Když 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-29 | Označte jako neplatné nebo převedené na ruční kontrolu, ponechte si původní sériové číslo | Toto 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ónou | Odstraňte tzinfo po jednotné konverzi na UTC | Excel 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 platformami | Explicitně deklarujte datový systém | Vý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
| projekt | datový systém 1900 | datový systém 1904 |
|---|---|---|
| Počáteční bod sériového čísla | Sériové číslo 1 odpovídá 1900-01-01 | Sériové číslo 0 odpovídá 1904-01-01 |
| Běžné výchozí zdroje | Windows | Raný Mac |
| Offset z jiného systému | Rozdíl 1 462 dní | Rozdíl 1 462 dní |
| Speciální čísla | Mylně počítající rok 1900 jako přestupný rok, existuje 29. 2. 1900 | Tento č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ů:
- 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
datetimeházíValueError. - 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.
- Pokud je objekt
datetimes 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. - 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 jev | Vstupní nebo okrajové podmínky | Oč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ředpokladu | Po přečtení wb.epoch převeďte sériové číslo | Ano |
| 1900-02-29 se objevilo v datech | Systém z roku 1900 se sériovým číslem 60 | Označte jako neplatné datum, přičemž si zachováte původní sériové číslo 60 | Ne, význam podnikání musí být ověřen ručně |
| Čas je částečně ztracen nebo nesprávně zarovnaný | Zadejte datetime s tzinfo | Po rovnoměrném převodu na UTC je tzinfo odstraněna a znovu zapsána | Některé vyžadují ruční určení cílového časového pásma |
| Buňky zobrazují čísla, ale jsou ve formátu dat | Typ hodnoty je správný, ale number_format chybí | Zkontrolujte a dokončte masku formátu data | Ano |
| Historická data (před 1. 1. 1. 1900) vykazují anomálie | Datum před 1. 1. 1900 | Přechod na ukládání textu nebo specializované historické databáze | Ne, 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.


