Este script procesa un fichero Excel de entrada con datos de personal y genera un fichero CSV limpio en una carpeta SQL.
El objetivo es:
- localizar automáticamente la fila real de cabeceras aunque el Excel tenga filas previas de título o resumen
- normalizar nombres de columnas para trabajar con cabeceras consistentes
- aplicar reglas de limpieza y filtrado sobre los datos
- formatear fechas y columnas numéricas para dejar la salida preparada para carga o consumo posterior
La salida se guarda en formato CSV con el mismo nombre base del fichero de entrada.
Ejemplo:
- entrada:
prueba3.xlsx - salida:
SQL/prueba3.csv
Excel de entrada
|
v
Detección automática de cabecera
|
v
Normalización de nombres de columnas
|
v
Filtros y reglas de negocio
|
v
Limpieza de textos y fechas
|
v
Conversión de columnas numéricas a enteros
|
v
CSV final en carpeta SQL
flowchart TD
A[Excel de entrada] --> B[Resolver ruta de entrada]
B --> C[Crear carpeta SQL si no existe]
C --> D[Detectar fila real de cabeceras]
D --> E[Cargar Excel con la cabecera correcta]
E --> F[Limpiar y normalizar nombres de columnas]
F --> G[Validar columnas obligatorias]
G --> H[Eliminar Empresa = 1001 o Totales]
H --> I[Reemplazar Empresa 1912 y 2281 por 24]
I --> J[Eliminar filas con No cotiza S.S.]
J --> K[Limpiar bajas por fusion/absorcion]
K --> L[Vaciar Fecha_baja si no hay causa]
L --> M[Formatear fechas YYYY/mm/DD]
M --> N[Quitar acentos conservando ñ]
N --> O[Convertir columnas numericas a enteros]
O --> P[Generar CSV en SQL/<nombre>.csv]
- Python 3
pandasopenpyxlnumpy
Ejecuta el script pasando como parámetro el fichero Excel que quieres procesar.
python LIMPIEZA_DATOS.py prueba3.xlsxTambién puedes pasar una ruta completa:
python LIMPIEZA_DATOS.py /ruta/completa/archivo.xlsxSi la ruta es relativa, el script la resuelve respecto a la carpeta en la que está guardado el propio script.
El script crea, si no existe, una carpeta llamada SQL dentro de la carpeta donde está el Excel de entrada.
Después genera el CSV de salida con esta regla:
- carpeta:
SQL - nombre: el mismo nombre base del Excel
- extensión:
.csv
Ejemplo:
- entrada:
/Datos/prueba3.xlsx - salida:
/Datos/SQL/prueba3.csv
La función resolver_ruta_entrada():
- comprueba que se ha pasado un argumento por línea de comandos
- convierte la ruta a absoluta si hace falta
- valida que el fichero exista
Si no se pasa fichero, el script termina mostrando:
Uso: python LIMPIEZA_DATOS.py <archivo_excel>
La función construir_ruta_salida():
- crea la carpeta
SQLsi no existe - devuelve la ruta del CSV final
Muchos Excel de origen no tienen las cabeceras en la primera fila porque incluyen:
- títulos
- resúmenes
- filas vacías
- textos auxiliares
La función detectar_fila_cabecera():
- lee las primeras 10 filas del Excel sin asumir cabecera
- limpia provisionalmente los valores de cada fila
- busca una fila que contenga simultáneamente las columnas
EmpresayNombre_empleado
Cuando la encuentra, esa fila se usa como header real al cargar el Excel.
Después de leer el Excel, el script normaliza todos los nombres de columna con limpiar_cabecera().
Esta limpieza hace lo siguiente:
- elimina espacios al principio y al final
- elimina acentos, pero conserva
ñyÑ - sustituye separadores y símbolos por
_ - elimina repeticiones de
_ - elimina
_al principio o al final
Ejemplos:
Empleado - Código->Empleado_CodigoCotización seguridad soci->Cotizacion_seguridad_sociDías percepción I.T.->Dias_percepcion_I_T
El script comprueba que existan estas columnas mínimas:
EmpresaCotizacion_seguridad_sociCausa_de_la_bajaFecha_bajaFecha_altaFecha_nacimientoFecha_antiguedad
Si falta alguna, lanza un error con el detalle de las columnas detectadas.
Se eliminan las filas donde Empresa sea:
1001Totales
Comparación aplicada tras convertir el valor a texto y eliminar espacios laterales.
En la columna Empresa:
1912se sustituye por242281se sustituye por24
Se eliminan las filas donde:
Cotizacion_seguridad_soci == "No cotiza S.S."
Si Causa_de_la_baja contiene exactamente:
Baja por fusión absorción empresa
entonces el script vacía:
Fecha_bajaCausa_de_la_baja
Internamente estos vacíos se guardan como nulos para evitar errores de tipos en pandas.
Si:
Fecha_bajacontiene una fecha válida- y
Causa_de_la_bajaestá vacía o nula
entonces se elimina el contenido de Fecha_baja.
Las columnas:
Fecha_altaFecha_nacimientoFecha_antiguedadFecha_baja
se convierten al formato:
YYYY/mm/DD
Ejemplo:
2024/06/17
Si el valor no es una fecha válida, queda vacío en la salida.
El script aplica quitar_acentos() a todas las celdas.
Comportamiento:
- elimina tildes y diéresis
- conserva
ñyÑ - no rompe valores nulos
- no altera números ni otros tipos no texto
Ejemplos:
TÉCNICOS->TECNICOSCategoría->Categorianiñez->niñez
Estas columnas se fuerzan a formato entero sin decimales:
Empleado_CodigoDias_alta_en_la_empresa_pTarifaCodigo_categoriaCodigo_contratoDias_percepcion_I_TDias_accidente
Regla aplicada:
- si el valor es numérico, se convierte a entero y después a texto sin
.0 - si el valor no existe, queda vacío
Ejemplos:
4.0->430.0->30- vacío -> vacío
El fichero se guarda con:
- separador CSV por defecto de
pandas encoding="utf-8-sig"- sin índice
Eso permite abrirlo con Excel conservando bien caracteres especiales en la mayoría de casos.
python LIMPIEZA_DATOS.py prueba3.xlsxResultado esperado:
OK: archivo generado en /ruta/de/la/carpeta/SQL/prueba3.csv
Error:
Uso: python LIMPIEZA_DATOS.py <archivo_excel>
Error indicando la ruta exacta no encontrada.
Error:
No se ha encontrado la fila de cabeceras en el Excel
Error detallando:
- qué columnas faltan
- qué columnas se han detectado realmente
En una sola ejecución, el script:
- recibe un Excel
- detecta la fila real de cabeceras
- normaliza nombres de columnas
- filtra y corrige registros
- limpia textos
- formatea fechas
- convierte determinados campos a enteros sin decimales
- genera un CSV en la carpeta
SQL