Teléfonos
Estandarización de números

Estandarización de números telefónicos
La estandarización de números telefónicos es un componente crítico del data cleansing, especialmente cuando se trabaja con datos internacionales. Te explicaré los aspectos más importantes de este proceso.
Estándares y normas internacionales
Recomendación UIT-T E.164: Es el estándar internacional principal para la numeración telefónica. Especifica:Longitud máxima de 15 dígitos (incluido el código de país)
Formato general: [+][código de país][número nacional]
Sin espacios, guiones u otros separadores en la representación canónica
Recomendación UIT-T E.123: Establece pautas para la presentación visual de números telefónicos:Uso del signo "+" para indicar el prefijo internacional
Espacios para mejorar la legibilidad (aunque en bases de datos se almacenan sin espacios)
Ejemplo: +34 91 123 4567
ISO 3166-1: Define los códigos de país (utilizados como base para los códigos telefónicos)
Mejores prácticas actuales
1. Almacenamiento:
Guardar siempre en formato E.164 completo
Mantener el campo como cadena de texto (no como número) para preservar ceros iniciales
Considerar campos separados para componentes (código país, área, número)
2. Procesamiento:
Utilizar bibliotecas especializadas como libphonenumber (Google)
Implementar validaciones regulares de la integridad de los datos
Mantener actualizadas las reglas nacionales (cambian con el tiempo)
3. Presentación al usuario:
Mostrar en formato local cuando se conoce el contexto
Usar formato internacional completo para comunicaciones globales
Ofrecer opciones de formato según el contexto de uso
4. Gestión de excepciones:
Establecer protocolos para números especiales (emergencias, servicios)
Documentar tratamiento de extensiones internas
Definir procedimientos para números imposibles de normalizar
Consideraciones específicas por región
América del Norte: Sistema de numeración uniforme (NANP) con código +1 y formato XXX-XXX-XXXX
Europa: Diversos sistemas nacionales con diferentes longitudes
Asia: Gran variabilidad en formatos y reglas nacionales
Latinoamérica: Diferentes longitudes y sistemas de marcación
Herramientas recomendadas
Google libphonenumber: Biblioteca de referencia para validación y formateo
PhoneNumberKit: Para ecosistema Apple
Twilio Lookup API: Validación y enriquecimiento de números
NumVerify: API de validación internacional
La estandarización de números telefónicos es un proceso complejo que requiere atención al detalle y conocimiento de las normas internacionales, pero implementado correctamente, elimina redundancias, facilita la comunicación y mejora significativamente la calidad de los datos de contacto.
Recomendación UIT-T E.164
La Recomendación UIT-T E.164 es el estándar internacional definido por la Unión Internacional de Telecomunicaciones - Sector de Normalización de las Telecomunicaciones (UIT-T) para la numeración telefónica. Su principal propósito es garantizar que los números de teléfono sean únicos y puedan ser utilizados globalmente en redes públicas y privadas de telecomunicaciones.
Contenido de la Recomendación E.164
La norma establece las reglas para la estructuración y el uso de los números telefónicos a nivel mundial. Sus principales aspectos incluyen:
Longitud máxima: Un número de teléfono internacional no puede exceder los 15 dígitos (sin contar los prefijos de marcación internacional, como el +).
Estructura del número:
Código de país (CC - Country Code): De 1 a 3 dígitos. Identifica a cada nación o región (Ej.: +1 para EE. UU. y Canadá, +54 para Argentina).
Código de área/local (NDC - National Destination Code): Opcional, dependiendo del país. Puede representar ciudades o regiones específicas dentro de un país.
Número de suscriptor (SN - Subscriber Number): Número único asignado a cada usuario dentro del área correspondiente.Formato de marcación: Debe ser compatible con distintos sistemas de telecomunicaciones, asegurando la interoperabilidad entre redes.
Asignación de números: Cada país regula la distribución de los números dentro de su territorio.
Números especiales: Incluye reglas para numeración de servicios de emergencia, telecomunicaciones satelitales y números especiales de tarifa premium.
La mayoría de los países siguen la norma E.164 porque es esencial para la interoperabilidad de las telecomunicaciones a nivel global. Sin embargo, hay algunas variaciones en la forma en que la aplican:
Algunos países han mantenido estructuras de numeración antiguas, adaptando solo ciertos aspectos de la E.164.
Otros tienen excepciones internas, como el uso de números más cortos para llamadas nacionales o servicios especiales.
En general, para llamadas internacionales, todos los países deben ajustarse a la E.164 para asegurar la comunicación entre redes de distintas naciones.
Proceso de estandarización de números
1. Recopilación y análisis inicial
Identificación de fuentes: Determinar de dónde provienen los números (formularios web, CRM, importaciones masivas)
Catalogación por país: Clasificar preliminarmente según país de origen si es posible
Análisis de patrones: Identificar formatos comunes y anomalías en los datos
2. Limpieza básica (pre-procesamiento)
Eliminación de caracteres no numéricos: Quitar espacios, guiones, paréntesis, puntos
Eliminación de prefijos de marcación: Quitar secuencias como "00" o "011" (prefijos internacionales)
Tratamiento de extensiones: Separar y almacenar aparte secuencias como "ext.", "x", "#"
3. Normalización estructural
Identificación del país: Determinar el código de país (si no está presente)
Aplicación de reglas nacionales: Adaptar según normativa específica de cada país
Conversión a formato E.164: Transformar a formato [+][código país][número nacional]
Eliminación de prefijos nacionales redundantes: Quitar prefijos como el "0" inicial en Europa
4. Validación
Verificación de longitud: Comprobar que se cumplen los requisitos de longitud del país
Validación de códigos de área: Verificar si los códigos de área/región son válidos
Comprobación de asignación: Validar si el rango numérico está asignado (cuando sea posible)
Detección de números especiales: Identificar números de servicios o emergencias
5. Enriquecimiento (opcional)
Geolocalización: Añadir información sobre localidad/región
Tipo de línea: Determinar si es móvil, fijo, VoIP, etc.
Operador: Identificar el proveedor de servicio
Zona horaria: Asociar con zona horaria correspondiente
Implementación con herramientas
Google libphonenumber
Esta biblioteca de código abierto desarrollada por Google es el estándar de facto para el procesamiento de números telefónicos.
Ejemplo de implementación en Python:
import phonenumbers
from phonenumbers import geocoder, carrier, timezone
def estandarizar_numero(numero_entrada, pais_default=None):
try:
# Si el número no tiene código de país, asumimos uno por defecto
if not numero_entrada.startswith('+') and pais_default:
numero_parsed = phonenumbers.parse(numero_entrada, pais_default)
else:
numero_parsed = phonenumbers.parse(numero_entrada)
# Verificar si el número es válido
if not phonenumbers.is_valid_number(numero_parsed):
return {
"status": "invalid",
"message": "Número no válido según las reglas del país"
}
# Convertir al formato E.164
numero_e164 = phonenumbers.format_number(numero_parsed,
phonenumbers.PhoneNumberFormat.E164)
# Formato internacional para visualización
numero_internacional = phonenumbers.format_number(numero_parsed,
phonenumbers.PhoneNumberFormat.INTERNATIONAL)
# Formato nacional para visualización local
numero_nacional = phonenumbers.format_number(numero_parsed,
phonenumbers.PhoneNumberFormat.NATIONAL)
# Información adicional
resultado = {
"status": "valid",
"e164": numero_e164,
"international": numero_internacional,
"national": numero_nacional,
"country_code": numero_parsed.country_code,
"country": geocoder.description_for_number(numero_parsed, "es"),
"type": "móvil" if numero_parsed.number_type == phonenumbers.PhoneNumberType.MOBILE else "fijo"
}
# Información del operador (solo disponible para algunos países)
operador = carrier.name_for_number(numero_parsed, "es")
if operador:
resultado["carrier"] = operador
# Zona horaria asociada
zonas_horarias = timezone.time_zones_for_number(numero_parsed)
if zonas_horarias:
resultado["timezone"] = zonas_horarias
return resultado
except Exception as e:
return {
"status": "error",
"message": str(e)
}
NumVerify API
Esta API REST permite validar y obtener información sobre números telefónicos.
import requests
def verificar_numero(numero, api_key):
# Asegurarse de que el número no tenga el signo +
if numero.startswith('+'):
numero = numero[1:]
url = f"http://apilayer.net/api/validate?access_key={api_key}&number={numero}"
try:
response = requests.get(url)
data = response.json()
if data.get("valid"):
return {
"status": "valid",
"e164": "+" + data.get("international_format").replace(" ", ""),
"international": data.get("international_format"),
"national": data.get("local_format"),
"country_code": data.get("country_prefix"),
"country": data.get("country_name"),
"type": data.get("line_type"),
"carrier": data.get("carrier"),
"location": data.get("location")
}
else:
return {
"status": "invalid",
"message": "Número no válido"
}
except Exception as e:
return {
"status": "error",
"message": str(e)
}
Ejemplos prácticos por país
1. Estados Unidos
Características del sistema NANP (North American Numbering Plan):
Código de país: +1
Estructura: NXX-NXX-XXXX (donde N=2-9, X=0-9)
10 dígitos (sin código de país)
Ejemplos de estandarización:
Entrada Resultado E.164 Formato internac. Formato nacional
(212) 555-1234 +12125551234 +1 212 555 1234 (212) 555-1234
646.555.4321 +16465554321 +1 646 555 4321 (646) 555-4321
1-800-123-4567 +18001234567 +1 800 123 4567 (800) 123-4567
Procesamiento con libphonenumber:
numero_usa = estandarizar_numero("(212) 555-1234", "US")
# Resultado:
# {
# "status": "valid",
# "e164": "+12125551234",
# "international": "+1 212 555 1234",
# "national": "(212) 555-1234",
# "country_code": 1,
# "country": "Estados Unidos",
# "type": "fijo",
# "timezone": ["America/New_York"]
# }
2. España
Características:
Código de país: +34
Estructura: 9 dígitos después del código de país
Móviles: comienzan con 6 o 7
Fijos: comienzan con 8 o 9
Ejemplos de estandarización:
Entrada Resultado E.164 Formato internacional Formato nacional
91 123 45 67 +34911234567 +34 911 23 45 67 911 23 45 67
600.12.34.56 +34600123456 +34 600 12 34 56 600 12 34 56
0034 922 123 456 +34922123456 +34 922 12 34 56 922 12 34 56
Procesamiento con libphonenumber:
numero_espana = estandarizar_numero("91 123 45 67", "ES")
# Resultado:
# {
# "status": "valid",
# "e164": "+34911234567",
# "international": "+34 911 23 45 67",
# "national": "911 23 45 67",
# "country_code": 34,
# "country": "España",
# "type": "fijo",
# "carrier": "Movistar",
# "timezone": ["Europe/Madrid"]
# }
3. Argentina
Características:
Código de país: +54
Estructura compleja con códigos de área de longitud variable
Prefijo "0" para llamadas nacionales
Prefijo "15" para móviles locales
Ejemplos de estandarización:
Entrada Resultado E.164 Formato internacional Formato nacional
(011) 4123-4567 +541141234567 +54 11 4123-4567 011 4123-4567
0351 15-678-9012 +5435167890123 +54 351 678-9012 0351 15-678-9012
+54 9 223 456-7890 +5492234567890 +54 9 223 456-7890 0223 15-456-7890
Procesamiento con libphonenumber:
numero_argentina = estandarizar_numero("011 4123-4567", "AR")
# Resultado:
# {
# "status": "valid",
# "e164": "+541141234567",
# "international": "+54 11 4123-4567",
# "national": "011 4123-4567",
# "country_code": 54,
# "country": "Argentina",
# "type": "fijo",
# "timezone": ["America/Argentina/Buenos_Aires"]
# }
Consideraciones avanzadas
Números móviles en Argentina: El sistema argentino utiliza el prefijo "9" en formato internacional para móviles, pero "15" en formato nacional, lo que añade complejidad.
Cambios en numeración: Los planes de numeración nacionales cambian periódicamente. Por ejemplo, España añadió un dígito a sus números fijos en 1998.
Formateo contextual: El formato de presentación debe adaptarse según el contexto:Para usuarios locales: formato nacional
Para comunicaciones internacionales: formato E.164 o internacional
Almacenamiento óptimo: Siempre almacenar en formato E.164 canónico (+CCNNNNN...)
Gestión de errores: Implementar una estrategia para números no verificables (guardar en formato original pero marcados como no verificados)
El proceso de estandarización de números telefónicos requiere una combinación de reglas generales y excepciones específicas por país, por lo que utilizar bibliotecas como libphonenumber simplifica enormemente esta tarea y reduce los errores.

