Datos, calidad y series · Última actualización: 2026-01-27

Timestamps: UTC, zonas horarias y desfases: casos y ejemplos

Vale amor 😄, aquí va la versión de casos y ejemplos para timestamps. La idea es entrenar el ojo: “veo esto en la serie → sospecho esto → lo confirmo así → lo arreglo así”.

Tema: Calidad de datos · Enfoque: casos reales típicos + lectura paso a paso.

1. Antes de empezar: dos relojes distintos

En calidad de datos, casi siempre hay dos tiempos aunque no lo veas:

  • Hora del fenómeno: cuándo ocurrió/lo midió el sensor (observed_time)
  • Hora de llegada: cuándo lo recibió tu sistema (ingest_time)

Muchos “picos raros” vienen de confundirlos.

2. Método de diagnóstico (siempre igual)

  1. Localiza un ancla: amanecer (radiación), máximo solar, paso frontal, comienzo de lluvia en radar.
  2. Mide el desfase: ¿es fijo (1h/2h) o variable?
  3. Busca patrones: solo en marzo/octubre (DST), solo tras cortes (backfill), duplicados al minuto (redondeo).
  4. Comprueba cadencia: ¿cada 60s/5min/10min como esperas?
  5. Decide la causa y aplica la corrección mínima (sin reescribir medio histórico si no hace falta).

3. Casos y ejemplos (con lectura paso a paso)

3.1 Caso 1: “Todo va 1 hora adelantado” (doble conversión)

Síntoma: el máximo de radiación/UV cae a una hora rara, pero todo “tiene sentido” internamente.

Lectura paso a paso:

  1. Marca el día despejado y mira el pico de radiación (debería encajar con el mediodía solar aproximado).
  2. Observa si el desfase es siempre el mismo (3600 s o 7200 s).
  3. Si el desfase es fijo: sospecha doble conversión (logger en local + servidor asume UTC + UI convierte otra vez).

Arreglo típico: dejar UTC en almacenamiento y solo convertir a local en UI una vez.

3.2 Caso 2: “El problema aparece solo en marzo/octubre” (DST)

Síntoma: en el cambio de hora hay huecos o duplicados y los diarios se descuadran.

Lectura paso a paso:

  1. Ve al día del salto DST: busca una hora repetida o una hora inexistente.
  2. Si eso está dentro del almacenamiento, casi seguro guardas hora local o timestamps naive.
  3. Comprueba si tus agregados diarios cortan en UTC o en local: si mezclas, los diarios “bailan”.

Arreglo típico: migrar/normalizar a UTC canónico + render por zona IANA (Europe/Madrid).

3.3 Caso 3: “Tras un corte, aparece un pico brutal de lluvia” (backfill)

Síntoma: 0.0 mm durante 40 min, vuelve internet y de golpe cae 25 mm en un minuto (y te asustas 😂).

Lectura paso a paso:

  1. Busca un gap justo antes del pico.
  2. Comprueba si el sensor/pluviómetro acumula internamente y lo envía al volver.
  3. Si el sistema asigna timestamp de llegada, convierte acumulado en “intensidad falsa”.
  4. Contrasta con radar o con coherencia interna (HR/T/viento): convectiva real suele dejar huellas.

Arreglo típico: separar observed_time vs ingest_time; marcar backfill; recalcular intensidades por ventana real.

3.4 Caso 4: “Duplicados al minuto exacto” (redondeo + reintentos)

Síntoma: ves dos o tres puntos con el mismo timestamp (a :00) y valores iguales o casi iguales.

Lectura paso a paso:

  1. Mira si el origen redondea a minuto.
  2. Busca reintentos de envío (red inestable).
  3. Si el pipeline no es idempotente, guardas duplicados.

Arreglo típico: clave única por (sensor_id + timestamp_original + seq) o idempotency key; no redondear si no hace falta.

3.5 Caso 5: “La gráfica a veces va hacia atrás” (out-of-order)

Síntoma: aparecen puntos “tarde” con tiempos anteriores, y el panel se vuelve loco.

Lectura paso a paso:

  1. Detecta deltas negativos (t[n] < t[n-1]).
  2. Comprueba buffering o envíos en lote (batch).
  3. Confirma si el sistema ordena por llegada en vez de por observed_time.

Arreglo típico: ordenar por observed_time; si aceptas tardíos, versionar backfill o usar un buffer temporal antes de publicar.

3.6 Caso 6: “Los diarios no cuadran” (corte diario inconsistente)

Síntoma: tu lluvia diaria no coincide con otra red cercana y cada cierto tiempo el error “salta”.

Lectura paso a paso:

  1. Define: ¿tu día es 00–24 local o 00–24 UTC?
  2. Revisa si en algún sitio se aplica una definición distinta (ETL vs panel).
  3. Comprueba el efecto DST: si cortas en local, el día del cambio tiene 23h o 25h.

Arreglo típico: fijar dayDefinition y documentarla; recalcular derivados si cambias política.

4. Mini-checklist de “confirmación” (antes de tocar nada)

  • ¿El desfase es fijo? (tz/doble conversión)
  • ¿Solo falla en DST? (storage local)
  • ¿Pasa tras gaps? (backfill)
  • ¿Hay duplicados al minuto? (redondeo/retries)
  • ¿Hay puntos fuera de orden? (out-of-order)
  • ¿Agregación definida (start/end)? (desfase por convención)

5. Tabla de síntomas y causa probable (para resolver en 5 minutos)

SíntomaCausa probableQué mirarSolución rápida
Shift fijo 1h/2hDoble conversión/tz asumidaPico radiación/UV, eventos anclaUTC en storage, tz solo en UI
Solo en marzo/octubreDST en storageHuecos/duplicados en el saltoNormalizar UTC + zona IANA
Pico tras corteBackfill/arrival-timeGap previo + clustering llegadaSeparar observed/ingest + flag
Duplicados exactosRedondeo + reintentosPrecisión origen + retriesIdempotencia + no redondear
Puntos “tarde”Out-of-orderDeltas negativosOrdenar por observed_time
Diarios rarosCorte diario mezcladodayDefinitionUnificar + recalcular derivados

6. Errores típicos (para no caer otra vez)

  • Guardar hora local en DB “porque es más cómodo”
  • Usar timestamps naive (sin tz)
  • Convertir a local en backend y otra vez en frontend
  • Confundir acumulado con intensidad tras un gap
  • No marcar ventanas incompletas (agregados engañosos)

7. Referencias

  • Met Office
  • WMO
  • NOAA