Spaces:
Running
Running
| """Extractor automático de fechas desde documentos""" | |
| import re | |
| from datetime import datetime | |
| from typing import List, Dict | |
| class DateExtractor: | |
| """Extrae fechas automáticamente de texto""" | |
| def __init__(self): | |
| self.meses = { | |
| 'enero': 1, 'febrero': 2, 'marzo': 3, 'abril': 4, | |
| 'mayo': 5, 'junio': 6, 'julio': 7, 'agosto': 8, | |
| 'septiembre': 9, 'octubre': 10, 'noviembre': 11, 'diciembre': 12 | |
| } | |
| def extract_dates(self, text: str) -> List[Dict]: | |
| """Extrae todas las fechas del texto""" | |
| fechas = [] | |
| patron1 = r'(\d{1,2}) de (enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)(?: de (\d{4}))?' | |
| for match in re.finditer(patron1, text, re.IGNORECASE): | |
| dia = int(match.group(1)) | |
| mes = self.meses[match.group(2).lower()] | |
| año = int(match.group(3)) if match.group(3) else datetime.now().year | |
| fechas.append({ | |
| 'fecha': f"{año}-{mes:02d}-{dia:02d}", | |
| 'texto_original': match.group(0), | |
| 'tipo': 'fecha' | |
| }) | |
| patron2 = r'del (\d{1,2}) de (enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre) al (\d{1,2}) de (enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)' | |
| for match in re.finditer(patron2, text, re.IGNORECASE): | |
| dia_inicio = int(match.group(1)) | |
| mes_inicio = self.meses[match.group(2).lower()] | |
| dia_fin = int(match.group(3)) | |
| mes_fin = self.meses[match.group(4).lower()] | |
| año = datetime.now().year | |
| fechas.append({ | |
| 'fecha_inicio': f"{año}-{mes_inicio:02d}-{dia_inicio:02d}", | |
| 'fecha_fin': f"{año}-{mes_fin:02d}-{dia_fin:02d}", | |
| 'texto_original': match.group(0), | |
| 'tipo': 'rango' | |
| }) | |
| return fechas | |
| def comparar_con_hoy(self, fecha_str: str) -> str: | |
| """Compara una fecha con hoy y devuelve: 'pasado', 'hoy', 'futuro'""" | |
| fecha = datetime.fromisoformat(fecha_str) | |
| hoy = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) | |
| fecha = fecha.replace(hour=0, minute=0, second=0, microsecond=0) | |
| if fecha < hoy: | |
| return "pasado" | |
| elif fecha == hoy: | |
| return "hoy" | |
| else: | |
| return "futuro" | |
| if __name__ == "__main__": | |
| extractor = DateExtractor() | |
| texto = """ | |
| La convocatoria estará abierta del 26 de enero al 4 de febrero de 2026. | |
| El módulo propedéutico comienza el 15 de marzo. | |
| """ | |
| fechas = extractor.extract_dates(texto) | |
| print("Fechas encontradas:") | |
| for f in fechas: | |
| print(f" - {f}") | |
| if f['tipo'] == 'rango': | |
| print(f" Estado: {extractor.comparar_con_hoy(f['fecha_inicio'])}") | |