A diferença de datas do Excel é de quatro anos: primeiro observe o sistema de datas da pasta de trabalho

iso_dates controla o método de serialização de data no arquivo e não transforma automaticamente a data e hora na memória em uma string. O número de série da data requer a época da pasta de trabalho; aqui comparamos os dois sistemas de data e verificamos o XML salvo e os valores de leitura.

O Excel exporta datas com deslocamento de quatro anos e, na maioria dos casos, o problema está no sistema de datas da pasta de trabalho, e não nos dados em si. Escrito para desenvolvedores e pessoas de dados responsáveis por exportações de relatórios, scripts ETL ou troca de arquivos Excel entre plataformas. Ao encontrar situações como mudança geral de data, números que não podem ser exibidos como datas, anomalias de dados por volta de 1900, etc., você pode primeiro solucionar o problema na ordem deste artigo.

Depois de ler este artigo, você entenderá a diferença entre os dois sistemas de data de 1900 e 1904, saberá como ler workbook.epoch para confirmar o sistema usado pela pasta de trabalho atual e dominará o método de aceitação de verificação de XML e leitura de valores após salvar. O código e as tabelas deste artigo são ilustrados com amostras sintéticas, adequadas como uma lista de verificação antes de trabalhar com documentos reais.

O que devo fazer se a data do Excel for quatro anos diferente? Conclusão de uma frase

Primeiro leia o workbook.epoch da pasta de trabalho e confirme o sistema de datas antes de converter; questões de data limite e fuso horário são tratadas separadamente.

sua situaçãoPráticas recomendadasrazão
A data exportada é globalmente compensada em aproximadamente 1.462 diasLeia workbook.epoch primeiro para confirmar o sistema de data da pasta de trabalhoA diferença entre os sistemas de 1900 e 1904 é de 1.462 dias, e suposições incorretas no lado da leitura farão com que todos os números de série sejam mal interpretados
A célula é um número, mas não pode ser exibida como uma dataVerifique e preencha a máscara de formato de data number_formatQuando o tipo numérico estiver correto, os formatos ausentes causarão anormalidades na exibição.
Datas anteriores a março de 1900 ou 29/02/1900 aparecem nos dadosMarcar como inválido ou transferido para revisão manual, manter o número de série originalEsta data não existe no calendário gregoriano e não deve ser forçada a ser convertida
datetime com fuso horário precisa ser escritoRetire o tzinfo após a conversão unificada para UTCO Excel não suporta o armazenamento de fusos horários, todos os horários são a hora local sem conhecimento
Os arquivos precisam ser trocados entre plataformasDeclarar explicitamente o sistema de datasAs configurações padrão do receptor são diferentes, o que pode produzir deslocamento silencioso

Diferenças entre os sistemas de data de 1900 e 1904

Uma data em um arquivo XLSX é essencialmente um número de série de ponto flutuante e seu significado depende inteiramente do sistema de data ao qual a pasta de trabalho está vinculada. A especificação XLSX permite duas épocas básicas:

  • Sistema de Data 1900: usado pelo Windows por padrão, o número de série 1 representa 1900-01-01
  • Sistema de data de 1904: usado por padrão nos primeiros Macs, o número de série 0 representa 1904-01-01

Existe uma diferença fixa de 1.462 dias entre os dois, que é a principal fonte da"diferença de datas de quatro anos". Além disso, o sistema de 1900 tem um problema histórico: trata incorretamente 1900 como ano bissexto, fazendo com que a data inexistente 1900-02-29 seja legalizada no Excel.

Comparação principal

ProjetoSistema de Datas de 1900Sistema de Datas de 1904
Ponto inicial do número de sérieO número de série 1 corresponde a 1900-01-01O número de série 0 corresponde a 1904-01-01
Fontes padrão comunsWindowsPrimeiros Mac
Deslocamento em relação a outro sistemaUma diferença de 1.462 diasUma diferença de 1.462 dias
Edições especiaisContando erroneamente 1900 como ano bissexto, existe em 29-02-1900Este artigo não aborda essas questões

Por que Dados de 1900 Anos Distantes Exigem Cautela Especial

Se você está lidando com dados históricos anteriores a março de 1900, o módulodatetime do Python não pode representar diretamente 29 de fevereiro. De acordo com a documentação oficial do OpenPyxl, para suportar o comportamento do Excel, a biblioteca simula essa exceção ao ler datas de janeiro e fevereiro no sistema de 1900, mas o próprio 1900-02-29 não pode convertê-la em um objeto datetime válido em Python.

Para a maioria dos dados empresariais modernos, o fundamental é identificar qual sistema o livro de exercícios atual está usando e declará-lo explicitamente ao trocar arquivos entre plataformas, para evitar deslocamentos silenciosos causados por diferentes configurações padrão no destinatário.

Exemplo de Síntese: Métodos de Entrada e Processamento de Fronteira

Para ilustrar o problema, vamos construir um cenário de síntese: um sistema financeiro exporta relatórios usando o sistema de datas de 1904, mas os scripts ETL posteriores costumam analisar o sistema de 1900.

Tratamento de Erros ou Entradas de Fronteira:

  1. Se você digitar o número de série 60 e o livro de exercícios for o sistema 1900, ele corresponde ao fictício 1900-02-29 no Excel. Python nativo datetime lança ValueError.
  2. Neste ponto, não force a conversão; em vez disso, capture a anomalia e registre como valor original ou marcador especial, já que a data não existe no calendário gregoriano.
  3. Se um objeto datetime com informações de fuso horário for passado e escrito, o openpyxl não converterá automaticamente o fuso horário, mas primeiro removerá o tzinfo; caso contrário, erros ou erros de escrita podem ocorrer.
  4. O próprio Excel não suporta armazenamento de fusos horários; todo o tempo é imperceptível no horário local.

Data System Detection and Security Conversion Code

O exemplo a seguir demonstra como lidar com segurança com diferenças de memória no sistema de datas. O código é apenas para demonstração lógica e não lê ou escreve arquivos de fato. Ele precisa rodar no seu próprio ambiente de dependência bloqueada. Openpyxl >= 3.1.0 é recomendado. O exemplo não inclui requisições de rede ou operações de sobrescrevimento de arquivos; todas as asserções são baseadas em dados sintéticos.

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

Critérios de Aceitação e Limites de Revisão Manual

Observe o fenômenoCondições de entrada ou de contornoDecisões esperadas de produção ou processamentoSe a automação é adequada
Todas as datas são uniformemente deslocadas por 1462 diaswb.epoch não corresponde à suposição analíticaApós ler o wb.epoch, reconverta o número de sérieSim
29-02-1900 apareceu nos dadosSistema 1900 com número de série 60Marque como data inválida, mantendo o número de série original 60Não, o significado do negócio deve ser confirmado manualmente
O tempo se perde parcialmente ou está desalinhadoDigite datetime com tzinfoApós converter uniformemente para UTC, o tzinfo é removido e escrito novamenteAlguns exigem definir manualmente o fuso horário alvo
As células exibem números, mas estão no formato de datasO tipo de valor está correto, mas number_format está ausenteVerifique e complete a máscara de formato de dataSim
Datas históricas (anteriores a 1900-01-01) mostram anomaliasData anterior a 1900-01-01Migre para armazenamento de texto ou bancos de dados históricos dedicadosNão, XLSX não é adequado para esse cenário

Note que a demonstração do código apenas verifica a correção da lógica de conversão e não representa um efeito de ponta a ponta. Arquivos reais podem misturar múltiplos formatos de data, formatos condicionais ou datas geradas por fórmulas, todos os quais exigem camadas adicionais de análise sintática. Ao encontrar datas anteriores a março de 1900, dados de colaboração entre fusos horários ou calendários não padrão (como anos lunares ou fiscais), processos manuais de revisão devem ser utilizados, e scripts automatizados não devem ser modificados arbitrariamente.

🎯 Qual método combina com você?

Se precisar ler a data do arquivo de exportação

Primeiro, leia o workbook.epoch, confirme o sistema de datas e depois decida se deve reconverter o número de série.

Se seus dados envolvem datas anteriores a março de 1900

Marque o registro relacionado a 1900-02-29 como inválido, mantenha o número de série original e entregue para um manual para confirmar o significado comercial.

Se você precisar escrever horas com fusos horários no Excel

Primeiro, converta para UTC uniformemente, depois remove o tzinfo; O fuso horário alvo precisa ser definido manualmente.

Se quiser trocar arquivos com outros sistemas

Declara explicitamente o sistema de datas e verifica o valor de data a ser lido na extremidade receptora.

❓ Perguntas Frequentes (FAQ)

1. Por que a data total de exportação é descolocada em cerca de quatro anos?

Uma razão comum é que o sistema de datas do caderno de exercícios não corresponde às suposições do lado da leitura. Há um intervalo de 1.462 dias entre os sistemas de 1900 e 1904.

2. iso_dates: Ele vai converter automaticamente a data-hora para uma string?

Não. O iso_dates controla apenas o método de serialização de data no arquivo e não converte automaticamente o datetime na memória para string.

3. Por que 1900-02-29 não pode ser convertido para data-hora em Python?

O sistema de 1900 trata erroneamente 1900 como ano bissexto, fazendo com que 1900-02-29 exista no Excel, mas não no calendário gregoriano. O datetime do Python vai lançar o ValueError, que deve registrar o valor original ou a tag especial.

4. Como você deve escrever o horário de data com um fuso horário no Excel?

O Excel não suporta armazenamento de fusos horários. Primeiro, deve ser convertida uniformemente para UTC e depois escrita após remover o tzinfo; O OpenPyXL não converte automaticamente fusos horários.

📝 Resumo

Problemas de deslocamento de data geralmente surgem pelo sistema de datas do workbook. Confirme o workbook.epoch antes de converter, o que pode evitar a maioria dos erros silenciosos. Questões de limites, data e fuso horário devem ser encaminhadas para revisão manual.

Experimente agora: Envie seu documento para começar a traduzir, preservando a formatação original

Referências e Próximos Passos

  • Documento oficial de data e hora do OpenPyxl: https://openpyxl.readthedocs.io/en/stable/datetime.html
  • Explicação da Microsoft sobre o sistema de datas de 1900/1904: https://docs.microsoft.com/en-us/office/troubleshoot/excel/1900-and-1904-date-system
  • Explicação da Microsoft sobre o bug do ano bissexto de 1900: https://docs.microsoft.com/en-us/office/troubleshoot/excel/wrongly-assumes-1900-is-leap-year

Em seguida: selecione uma amostra ansiosa do Excel à qual você tenha acesso, execute o código de detecção de época acima e confirme se o sistema de datas corresponde à sua lógica de processamento. Se forem encontradas inconsistências, ajuste os parâmetros de conversão antes de gerar o entregável traduzido.

Use esta lista de verificação para tradução de documentos

Primeiro, decida qual conteúdo é texto, qual é fórmula e código de negócios, depois traduza a tabela. A inspeção pós-tradução não apenas confirma se o chinês foi convertido para o idioma de destino, mas também garante que fórmulas, identificadores e relações de citação não tenham sido alterados.

O OmniDoc (Entrada de Produto) oferece portais de tradução de documentos em múltiplos formatos, e seu site oficial introduz OCR, glossários e recursos de referência bilíngues. Para equipes que querem começar diretamente pelos arquivos, esse é um caminho que vale a pena avaliar com amostras reais. Por favor, use o arquivo anonimizado que você autorizou para enviar e verifique os resultados com a lista de verificação neste artigo. Este artigo não afirma que o OmniDoc utiliza as bibliotecas de código aberto ou algoritmos internos mencionados no artigo, nem substitui testes de desempenho de produtos por exemplos.

Atualizado em 2026-11-13