La diferencia de fechas de Excel es de cuatro años: primero mire el sistema de fechas del libro de trabajo

iso_dates controla el método de serialización de fechas en el archivo y no convierte automáticamente la fecha y hora en la memoria en una cadena. El número de serie de la fecha requiere la época del libro; Aquí comparamos los dos sistemas de fechas y verificamos el XML guardado y los valores de lectura.

Excel exporta fechas que están compensadas por cuatro años y, en la mayoría de los casos, el problema está en el sistema de fechas del libro, no en los datos en sí. Escrito para desarrolladores y personas de datos responsables de exportaciones de informes, scripts ETL o intercambio multiplataforma de archivos Excel. Cuando encuentre situaciones como un cambio de fecha general, números que no se pueden mostrar como fechas, anomalías en los datos alrededor de 1900, etc., primero puede solucionar el problema siguiendo el orden de este artículo.

Después de leer este artículo, comprenderá la diferencia entre los dos sistemas de fechas de 1900 y 1904, sabrá cómo leer workbook.epoch para confirmar el sistema utilizado por el libro de trabajo actual y dominará el método de aceptación para verificar XML y volver a leer los valores después de guardar. El código y las tablas de este artículo están ilustrados con ejemplos sintéticos, adecuados como lista de verificación antes de trabajar con documentos reales.

¿Qué debo hacer si la fecha de Excel es cuatro años diferente? Conclusión de una frase

Primero lea el workbook.epoch del libro y confirme el sistema de fechas antes de realizar la conversión; Los problemas de fecha límite y zona horaria se tratan por separado.

tu situaciónPrácticas recomendadasrazón
La fecha de exportación se compensa en total con aproximadamente 1462 días.Lea workbook.epoch primero para confirmar el sistema de fechas del libro de trabajo.La diferencia entre los sistemas 1900 y 1904 es de 1462 días, y las suposiciones incorrectas en el lado de lectura causarán que todos los números de serie se malinterpreten.
La celda es un número pero no se puede mostrar como una fecha.Verifique y complete la máscara de formato de fecha number_formatCuando el tipo numérico es correcto, los formatos faltantes provocarán anomalías en la visualización.
En los datos aparecen fechas anteriores a marzo de 1900 o 1900-02-29Marcar como no válido o transferido a revisión manual; conservar el número de serie originalEsta fecha no existe en el calendario gregoriano y no se debe obligar a convertirla.
Es necesario escribir datetime con zona horariaStrip tzinfo después de la conversión unificada a UTCExcel no admite el almacenamiento de zonas horarias, todas las horas son hora local sin conocimiento
Los archivos deben intercambiarse entre plataformasDeclarar explícitamente el sistema de fechasLa configuración predeterminada del receptor es diferente, lo que puede producir una compensación silenciosa.

Diferencias entre los sistemas de fechas de 1900 y 1904

Una fecha en un archivo XLSX es esencialmente un número de serie de punto flotante y su significado depende completamente del sistema de fechas al que está vinculado el libro. La especificación XLSX permite dos épocas base:

  • Sistema de fecha 1900: utilizado por Windows de forma predeterminada, el número de serie 1 representa 1900-01-01
  • Sistema de fecha 1904: se utiliza de forma predeterminada en las primeras Mac, el número de serie 0 representa 1904-01-01

Hay un desfase fijo de 1462 días entre los dos, que es la fuente principal de la "diferencia de fecha de cuatro años". Además, el sistema 1900 tiene un problema histórico: trata incorrectamente a 1900 como un año bisiesto, provocando que la fecha inexistente 1900-02-29 sea legalizada en Excel.

Comparación principal

proyectosistema de fecha 1900sistema de fecha de 1904
Punto de inicio del número de serieEl número de serie 1 corresponde al 1900-01-01El número de serie 0 corresponde a 1904-01-01
Fuentes predeterminadas comunesWindowsPrimeros Mac
Desplazamiento respecto a otro sistemaUna diferencia de 1.462 díasUna diferencia de 1.462 días
Números especialesErróneamente contando 1900 como año bisiesto, existe el 29-02-1900Este artículo no aborda estos temas

Por qué los datos de 1900 años lejanos requieren especial precaución

Si estás tratando con datos históricos anteriores a marzo de 1900, el módulo datetime de Python no puede representar directamente el 29 de febrero. Según la documentación oficial de OpenPyxl, para soportar el comportamiento en Excel, la biblioteca simula esta excepción al leer las fechas de enero y febrero en el sistema de 1900, pero el 29-02-1900 no puede convertirla en un objeto datetime válido en Python.

Para la mayoría de los datos empresariales modernos, la clave es identificar qué sistema está usando el libro de trabajo actual y declararlo explícitamente al intercambiar archivos entre plataformas para evitar desplazamientos silenciosos causados por diferentes configuraciones predeterminadas en el destinatario.

Ejemplo de síntesis: Métodos de entrada y procesamiento de fronteras

Para ilustrar el problema, construyamos un escenario de síntesis: un sistema financiero exporta informes usando el sistema de fechas de 1904, pero los scripts ETL posteriores por defecto analizan el sistema de 1900.

Manejo de errores o entradas de frontera:

  1. Si introduces el número de serie 60 y el cuaderno de ejercicios es el sistema 1900, corresponde al ficticio 1900-02-29 en Excel. datetime nativo en Python lanza ValueError.
  2. En este punto, no forces la conversión; en su lugar, captura la anomalía y regístrala como el valor original o marcador especial, ya que la fecha no existe en el calendario gregoriano.
  3. Si se pasa y escribe un objeto datetime con información de zona horaria, openpyxl no convertirá automáticamente la zona horaria, pero primero eliminará tzinfo; de lo contrario, pueden producirse errores o errores de escritura.
  4. Excel en sí no soporta almacenamiento de zonas horarias; todo el tiempo es hora local imperceptible.

Código de detección y conversión de seguridad del sistema de fechas

El siguiente ejemplo demuestra cómo manejar de forma segura las diferencias de memoria en sistemas de fechas. El código es solo para demostración lógica y no lee ni escribe archivos realmente. Debe ejecutarse en tu propio entorno de dependencias bloqueadas. Se recomienda Openpyxl >= 3.1.0. El ejemplo no incluye solicitudes de red ni operaciones de sobrescritura de archivos; todas las afirmaciones se basan en datos 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

Criterios de aceptación y límites de revisión manual

Observa el fenómenoCondiciones de entrada o de fronteraSalidas esperadas o decisiones de procesamientoSi la automatización es adecuada
Todas las fechas se retrasan uniformemente en 1462 díaswb.epoch no coincide con la suposición analíticaDespués de leer wb.epoch, reconvertir el número de serieSí
El 29-02-1900 apareció en los datosSistema 1900 con número de serie 60Marca como fecha inválida, conservando el número de serie original 60No, el significado del negocio debe confirmarse manualmente
El tiempo se pierde parcialmente o está desalineadoIngrese datetime con tzinfoTras convertir uniformemente a UTC, el tzinfo se elimina y se vuelve a escribirAlgunos requieren definir manualmente la zona horaria objetivo
Las celdas muestran números pero tienen el formato de fechasEl tipo de valor es correcto pero falta number_formatRevisa y completa la máscara de formato de fechaSí
Las fechas históricas (anteriores al 01-01-1900) muestran anomalíasFecha anterior al 1900-01-01Cambiar a almacenamiento de texto o bases de datos históricas dedicadasNo, XLSX no es adecuado para este escenario

Obsérvese que la demostración del código solo verifica la corrección de la lógica de conversión y no representa un efecto de extremo a extremo. Los archivos reales pueden mezclar múltiples formatos de fecha, formatos condicionales o fechas generadas por fórmulas, todos los cuales requieren capas adicionales de análisis sintáctico. Al encontrarse con fechas anteriores a marzo de 1900, datos de colaboración entre zonas horarias o calendarios no estándar (como años lunares o fiscales), deben utilizarse procesos de revisión manual y no se deben modificar los scripts automatizados arbitrariamente.

🎯 ¿Qué método te conviene?

Si necesitas leer la fecha del archivo de exportación

Primero, lee workbook.epoch, confirma el sistema de fechas y luego decide si reconvertir el número de serie.

Si tus datos incluyen fechas anteriores a marzo de 1900

Marca el registro relacionado con el 29-02-1900 como inválido, conserva el número de serie original y entrégalo a un manual para confirmar el significado del negocio.

Si necesitas escribir la hora con huso horario en Excel

Primero, convertir a UTC de forma uniforme, luego eliminar tzinfo; La zona horaria objetivo debe definirse manualmente.

Si quieres intercambiar archivos con otros sistemas

Declara explícitamente el sistema de fechas y verifica el valor de la fecha para que se lea en el lado receptor.

❓ Preguntas frecuentes (FAQ)

1. ¿Por qué la fecha total de exportación se desplaza unos cuatro años?

Una razón común es que el sistema de fechas del cuaderno de ejercicios no coincide con las suposiciones del lado de la lectura. Hay un intervalo de 1.462 días entre los sistemas de 1900 y 1904.

2. iso_dates: ¿Convierte automáticamente la fecha y hora en una cadena?

No. iso_dates solo controla el método de serialización de fechas en el archivo y no convierte automáticamente datetime en memoria a cadena.

3. ¿Por qué no se puede convertir el 29-02-1900 a hora de fechas en Python?

El sistema de 1900 trata erróneamente 1900 como un año bisiesto, lo que hace que el 29-02-1900 exista en Excel pero no en el calendario gregoriano. datetime de Python lanzará ValueError, que debería registrar el valor original o la etiqueta especial.

4. ¿Cómo deberías escribir la hora de la fecha con una zona horaria en Excel?

Excel no soporta almacenar zonas horarias. Primero, debe convertirse uniformemente a UTC y luego escribirse tras eliminar tzinfo; OpenPyXL no convierte automáticamente las zonas horarias.

📝 Resumen

Los problemas de desplazamiento de fecha suelen surgir por el sistema de fechas del libro de trabajo. Confirma workbook.epoch antes de convertir, lo que puede evitar la mayoría de los errores silenciosos. Los problemas de límite, fecha y zona horaria deben pasarse a revisión manual.

Experiencia ahora: Sube tu documento para empezar a traducir, conservando el formato original

Referencias y próximos pasos

  • Documento oficial de fecha y hora de OpenPyxl: https://openpyxl.readthedocs.io/en/stable/datetime.html
  • Explicación de Microsoft sobre el sistema de fechas de 1900/1904: https://docs.microsoft.com/en-us/office/troubleshoot/excel/1900-and-1904-date-system
  • Explicación de Microsoft del error del año bisiesto de 1900: https://docs.microsoft.com/en-us/office/troubleshoot/excel/wrongly-assumes-1900-is-leap-year

A continuación: selecciona una muestra ansiosa de Excel a la que tengas acceso, ejecuta el código de detección de épocas anterior y confirma si su sistema de fechas coincide con tu lógica de procesamiento. Si se detectan inconsistencias, ajusta los parámetros de conversión antes de generar el entregable traducido.

Usa esta lista de verificación para la traducción de documentos

Primero, decide qué contenido es texto, cuál es fórmula y código de negocio, y luego traduce la tabla. La inspección post-traducción no solo confirma si el chino ha sido convertido al idioma de destino, sino que también asegura que las fórmulas, identificadores y relaciones de citación no hayan sido alteradas.

OmniDoc (Entrada de producto) ofrece portales de traducción de documentos multiformato, y su página web oficial introduce OCR, glosarios y funciones de referencia bilingües. Para los equipos que quieren empezar directamente desde los archivos, este es un camino que merece la pena evaluar con muestras reales. Por favor, utiliza el archivo anonimizado que has autorizado para subir y verifica los resultados con la lista de comprobación de este artículo. Este artículo no afirma que OmniDoc utilice las librerías de código abierto ni los algoritmos internos mencionados en el artículo, ni sustituye las pruebas de rendimiento del producto por ejemplos.

Actualizado 2026-11-13