Разница в датах Excel составляет четыре года: сначала взгляните на систему дат рабочей книги.

iso_dates управляет методом сериализации даты в файле и не преобразует автоматически дату и время в памяти в строку. Серийный номер даты требует указания эпохи книги; здесь мы сравниваем две системы дат и проверяем сохраненные значения XML и считанные значения.

— iso_dates управляет только методом сериализации даты в файле и не преобразует автоматически дату и время в памяти в строку. — Перед записью дату и время с часовым поясом необходимо преобразовать и удалить tzinfo, поскольку Excel не хранит информацию о часовом поясе.

  • Серийный номер 60 в системе 1900 соответствует номеру 1900-02-29, которого не существует. Его следует пометить как недействительный, а исходное значение следует сохранить для подтверждения вручную.

— Пример кода был проверен только в изолированной среде с использованием синтетических данных и не является гарантией производительности для всех реальных файлов.

Excel экспортирует даты, смещенные на четыре года, и в большинстве случаев проблема связана с системой дат книги, а не с самими данными. Написано для разработчиков и специалистов по обработке данных, ответственных за экспорт отчетов, сценарии ETL или межплатформенный обмен файлами Excel. Когда вы сталкиваетесь с такими ситуациями, как общий сдвиг дат, числа, которые не могут отображаться как даты, аномалии данных около 1900 года и т. д., вы можете сначала устранить неполадки в порядке, описанном в этой статье.

Прочитав эту статью, вы поймете разницу между двумя системами дат 1900 и 1904 годов, узнаете, как читать workbook.epoch, чтобы подтвердить систему, используемую в текущей книге, и освоите приемочный метод проверки XML и обратного чтения значений после сохранения. Код и таблицы в этой статье проиллюстрированы синтетическими образцами, которые можно использовать в качестве контрольного списка перед работой с реальными документами.

Что делать, если дата в Excel отличается на четыре года? Вывод в одно предложение

Сначала прочтите workbook.epoch книги и подтвердите систему дат перед преобразованием; Проблемы с датой границы и часовым поясом решаются отдельно.

твоя ситуацияРекомендуемые практикипричина
Экспортированная дата в целом смещена примерно на 1462 дня.Сначала прочтите workbook.epoch, чтобы подтвердить систему дат рабочей книги.Разница между системами 1900 и 1904 составляет 1462 дня, и неправильные предположения на стороне чтения приведут к неправильной интерпретации всех серийных номеров.
Ячейка представляет собой число, но не может отображаться как дата.Проверьте и заполните маску формата даты number_format.Если числовой тип правильный, отсутствие форматов приведет к нарушениям отображения.
В данных появляются даты до 1900 марта или 29 февраля 1900 г.Отметить как недействительный или передать на проверку вручную, сохранить исходный серийный номерЭта дата не существует в григорианском календаре, и ее не следует принудительно конвертировать.
datetime с указанием часового пояса необходимо написатьУдалить tzinfo после унифицированного преобразования в UTCExcel не поддерживает сохранение часовых поясов, все время указано по местному времени без ведома.
Файлы должны обмениваться между платформамиЯвно объявить систему датНастройки приемника по умолчанию отличаются, что может привести к бесшумному смещению

Различия между системами дат 1900 и 1904 годов

Дата в файле XLSX по сути представляет собой серийный номер с плавающей запятой, и ее значение полностью зависит от системы дат, к которой привязана книга. Спецификация XLSX допускает две базовые эпохи:

  • Система дат 1900: используется Windows по умолчанию, серийный номер 1 соответствует 1900-01-01.
  • Система дат 1904: используется по умолчанию на ранних версиях Mac, серийный номер 0 соответствует 1904-01-01.

Между ними существует фиксированное смещение в 1462 дня, что является основным источником «разницы в датах в четыре года». Кроме того, у системы 1900 года есть историческая проблема: она неправильно считает 1900 год високосным, в результате чего несуществующая дата 29 февраля 1900 года легализуется в Excel.

Сравнение ядра

проектСистема дат 1900 годаСистема дат 1904 года
Начальная точка серийного номераСерийный номер 1 соответствует 1900-01-01.Серийный номер 0 соответствует 1 января 1904 г.
Общие источники по умолчаниюWindowsРанний Мак
смещение из другой системыРазница 1462 дняРазница 1462 дня
специальные вопросыОшибочно принят 1900 год за високосный, существует с 29 февраля 1900 г.В данной статье не рассматриваются такие вопросы

Почему данные до 1900 года требуют особого внимания

Если вы имеете дело с историческими данными до марта 1900 года, модуль Python datetime не может напрямую представлять 29 февраля. Согласно официальной документации openpyxl, чтобы быть совместимой с поведением Excel, библиотека будет имитировать это исключение при чтении дат в январе и феврале в системе 1900, но само 1900-02-29 не может быть преобразовано в действительный объект Python datetime.

Для большинства современных бизнес-данных важно определить, какую систему использует текущая книга, и явно объявить ее при обмене файлами между платформами, чтобы избежать скрытого дрейфа на принимающей стороне из-за различных настроек по умолчанию.

Пример синтеза: методы граничного ввода и обработки

Чтобы проиллюстрировать проблему, мы создаем синтетический сценарий: отчет, экспортируемый финансовой системой, использует систему дат 1904 года, но последующий ETL-скрипт по умолчанию анализирует его в соответствии с системой 1900 года.

Обработка ошибок или граничных входных данных:

  1. Если входной серийный номер равен 60 и книга предназначена для системы 1900, она соответствует вымышленному 29 февраля 1900 года в Excel. Собственный datetime Python выдает ValueError.
  2. В это время исключение не должно быть принудительным, но исключение должно быть перехвачено и записано как исходное значение или специальная отметка, поскольку дата не существует в григорианском календаре.
  3. Если для записи передается объект datetime с информацией о часовом поясе, openpyxl не будет автоматически преобразовывать часовой пояс, но требует сначала удалить tzinfo, в противном случае может возникнуть ошибка записи или ошибка.
  4. Excel сам по себе не поддерживает хранение часовых поясов, и все время указано по местному времени без ведома.

Обнаружение системы даты и код безопасного преобразования

В следующем примере показано, как безопасно обрабатывать различия в системе дат в памяти. Код предназначен только для логической демонстрации и не выполняет фактическое чтение и запись файлов. Его необходимо запустить в вашей собственной среде заблокированных зависимостей. Рекомендуется Openpyxl >= 3.1.0. В примеры не включены сетевые запросы или операции перезаписи файлов, все утверждения основаны на синтетических данных.

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

Критерии приемки и границы ручной проверки

Наблюдайте за явлениямивходные или граничные условияожидаемый результат или решение по обработкеПрименима ли автоматизация
Все даты смещены равномерно на 1462 дня.wb.epoch несовместим с аналитическими предположениямиПрочитайте wb.epoch и повторно преобразуйте порядковый номер.да
В данных появляется 29 февраля 1900 г.Система 1900 года с серийным номером 60Дата помечена как недействительная, сохраните исходный серийный номер 60.Нет, вам нужно вручную подтвердить деловое значение
Часть времени отсутствует или неуместнаВведите datetime с помощью tzinfo.Преобразуйте в UTC равномерно, а затем удалите tzinfo для записи.часть, вам необходимо вручную определить целевой часовой пояс
В ячейке отображается число, но в формате даты.Числовой тип правильный, но number_format отсутствует.Проверьте и заполните маску формата датыда
Исторические даты (ранее 1 января 1900 г.) отображаются ненормально.Дата ранее 1 января 1900 г.Вместо этого используйте текстовое хранилище или специальную базу данных архиватора.Нет, XLSX не подходит для этого сценария.

Следует отметить, что демонстрация кода лишь проверяет правильность логики преобразования и не дает эффекта сквозного преобразования. Реальные файлы могут содержать несколько форматов дат, условные форматы или даты, созданные с помощью формул, которые требуют дополнительных уровней анализа. При обнаружении дат до марта 1900 года, данных совместной работы в разных часовых поясах или нестандартных календарей (например, лунного календаря, финансового года) вам следует запустить процесс проверки вручную, а автоматизированные сценарии не должны вносить несанкционированные исправления.

🎯 Какой метод подходит вам?

Если вам нужно прочитать дату из файла экспорта

Сначала прочитайте workbook.epoch, подтвердите систему дат, а затем решите, следует ли повторно преобразовать серийный номер.

Если ваши данные включают даты до марта 1900 г.

Отметьте записи, относящиеся к 1900-02-29, как недействительные, сохраните исходный серийный номер и передайте его на ручное подтверждение делового значения.

Если вам нужно записать время с часовым поясом в Excel

Сначала конвертируйте в UTC равномерно, а затем удалите tzinfo; целевой часовой пояс необходимо определить вручную.

Если вы хотите обмениваться файлами с другими системами

Явно объявите систему дат и проверьте значения даты считывания на принимающей стороне.

❓ Часто задаваемые вопросы (FAQ)

1. Почему дата экспорта сдвинута примерно на четыре года?

Распространенной причиной является то, что система дат книги не соответствует предположениям на стороне чтения. Разница между двумя системами 1900 и 1904 годов составляет 1462 дня.

2. iso_dates автоматически преобразует дату и время в строку?

Не будет. iso_dates управляет только методом сериализации даты в файле и не преобразует автоматически datetime в памяти в строку.

3. Почему 29 февраля 1900 года нельзя преобразовать в дату и время Python?

1900 Система неправильно считает 1900 год високосным, в результате чего в Excel существует 29 февраля 1900 года, но этот день не существует в григорианском календаре. datetime Python выдает ValueError, и в этом случае должно быть зарегистрировано исходное числовое значение или специальный флаг.

4. Как записать дату и время с часовым поясом в Excel?

Excel не поддерживает сохранение часовых поясов. Сначала его следует преобразовать в формат UTC, а затем перед записью удалить tzinfo; openpyxl не выполнит автоматическое преобразование часового пояса.

📝 Резюме

Проблемы смещения даты обычно возникают из-за системы дат книги. Подтверждение workbook.epoch перед преобразованием позволяет избежать большинства скрытых ошибок. Вопросы, связанные с датой границы и часовым поясом, должны быть переданы на рассмотрение человека.

Попробуйте сейчас: загрузите документ, чтобы начать перевод, сохранив исходный макет.

Ссылки и следующие шаги

  • официальная документация openpyxl по дате и времени: https://openpyxl.readthedocs.io/en/stable/datetime.html
  • Примечание Microsoft о системе дат 1900/1904 годов: https://docs.microsoft.com/en-us/office/troubleshoot/excel/1900-and-1904-date-system.
  • Объяснение Microsoft об ошибке високосного года 1900 года: https://docs.microsoft.com/en-us/office/troubleshoot/excel/wrongly-assumes-1900-is-leap-year.

Следующий шаг: выберите десенсибилизированный образец Excel, на использование которого у вас есть разрешение, запустите приведенный выше код определения эпохи и подтвердите, соответствует ли его система дат вашей логике обработки. Если обнаружены несоответствия, откорректируйте параметры преобразования перед созданием результатов перевода.

Используйте этот контрольный список для перевода документов

Сначала решите, какое содержимое является текстом, какое — формулой и бизнес-кодированием, а затем переведите таблицу. Проверка после перевода не только подтверждает, был ли китайский язык преобразован в целевой язык, но также подтверждает, что формулы, идентификаторы и ссылочные отношения не были изменены.

OmniDoc (портал продуктов) предоставляет многоформатный портал для перевода документов, а на официальном сайте представлены функции оптического распознавания символов, глоссария и двуязычного сравнения. Для команд, которые хотят работать непосредственно с файлами, этот путь стоит оценить на реальных примерах. Используйте десенсибилизированные файлы, на загрузку которых у вас есть разрешение, и используйте элементы проверки в этой статье, чтобы просмотреть результаты. В этой статье не утверждается, что OmniDoc использует библиотеки с открытым исходным кодом или внутренние алгоритмы, описанные в статье, а также не используются примеры для замены тестирования производительности продукта.

Обновлено 2026-11-13