docs: def _generate_date_indicators(catalog, tolerance=0.2, only_numeric=False):
      """Genera indicadores relacionados a las fechas de publicación
      y actualización del catálogo pasado por parámetro. La evaluación de si
      un catálogo se encuentra actualizado o no tiene un porcentaje de
      tolerancia hasta que se lo considere como tal, dado por el parámetro
      tolerance.
  
      Args:
          catalog (dict o str): path de un catálogo en formatos aceptados,
              o un diccionario de python
  
          tolerance (float): porcentaje de tolerancia hasta que se considere
              un catálogo como desactualizado, por ejemplo un catálogo con
              período de actualización de 10 días se lo considera como
              desactualizado a partir de los 12 con una tolerancia del 20%.
              También acepta valores negativos.
  
      Returns:
          dict: diccionario con indicadores
      """
      result = {
          'datasets_desactualizados_cant': None,
          'datasets_actualizados_cant': None,
          'datasets_actualizados_pct': None,
          'catalogo_ultima_actualizacion_dias': None
      }
      if not only_numeric:
          result.update({
              'datasets_frecuencia_cant': {}
          })
  
      try:
          dias_ultima_actualizacion =\
              _days_from_last_update(catalog, "modified")
          if not dias_ultima_actualizacion:
              dias_ultima_actualizacion =\
                  _days_from_last_update(catalog, "issued")
  
          result['catalogo_ultima_actualizacion_dias'] = \
              dias_ultima_actualizacion
  
      except Exception as e:
          msg = u'Error generando indicadores de fecha del catálogo {}: {}'\
              .format(catalog['title'], str(e))
          logger.error(msg)
          return result
  
      actualizados = 0
      desactualizados = 0
      periodicity_amount = {}
  
      for dataset in catalog.get('dataset', []):
          # Parseo la fecha de publicación, y la frecuencia de actualización
          periodicity = dataset.get('accrualPeriodicity')
          if not periodicity:
              continue
          # Si la periodicity es eventual, se considera como actualizado
          if periodicity == 'eventual':
              actualizados += 1
              prev_periodicity = periodicity_amount.get(periodicity, 0)
              periodicity_amount[periodicity] = prev_periodicity + 1
              continue
  
          # dataset sin fecha de última actualización es desactualizado
          if "modified" not in dataset:
              desactualizados += 1
          else:
              # Calculo el período de días que puede pasar sin actualizarse
              # Se parsea el período especificado por accrualPeriodicity,
              # cumple con el estándar ISO 8601 para tiempos con repetición
              try:
                  date = helpers.parse_date_string(dataset['modified'])
                  days_diff = float((datetime.now() - date).days)
                  interval = helpers.parse_repeating_time_interval(
                      periodicity) * \
                      (1 + tolerance)
              except Exception as e:
                  msg = u'Error generando indicadores'\
                        u'de fecha del dataset {} en {}: {}'
                  msg.format(dataset['identifier'], catalog['title'], str(e))
                  logger.error(msg)
                  # Asumo desactualizado
                  desactualizados += 1
                  continue
  
              if days_diff < interval:
                  actualizados += 1
              else:
                  desactualizados += 1
  
          prev_periodicity = periodicity_amount.get(periodicity, 0)
          periodicity_amount[periodicity] = prev_periodicity + 1
  
      datasets_total = len(catalog.get('dataset', []))
      actualizados_pct = 0
      if datasets_total:
          actualizados_pct = float(actualizados) / datasets_total
      result.update({
          'datasets_desactualizados_cant': desactualizados,
          'datasets_actualizados_cant': actualizados,
          'datasets_actualizados_pct': round(actualizados_pct, 4)
      })
      if not only_numeric:
          result.update({
              'datasets_frecuencia_cant': periodicity_amount
          })
      return result