Skip to main content

Timestamps → JSON (encoder + checklist)

Propósito

Evitar TypeError: Object of type Timestamp is not JSON serializable en exportes jerárquicos: encoder custom para pandas.Timestamp, conversión defensiva en DataFrame y troubleshooting profundo.

Para políticas de formato/base temporal y compresión, ver /metodos/etl_json_policies.

Encoder recomendado (ISO-8601)

import json
import pandas as pd

class AtlasJSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, pd.Timestamp):
# fecha-only; si necesitás datetime, usa .isoformat()
return obj.strftime("%Y-%m-%d")
return super().default(obj)

# uso:
# json.dump(payload, fp, cls=AtlasJSONEncoder)

Funciona aunque aparezcan Timestamp en niveles profundos del objeto.

Checklist antes de exportar

1) Limpiar columnas datetime en DataFrames

for col in df.columns:
if str(df[col].dtype).startswith("datetime64"):
df[col] = df[col].astype(str) # o dt.strftime(...) según contrato

Evita que to_dict() inyecte Timestamp en data_hierarchy.

2) Timestamps generados en código → string

import datetime as dt
timestamp = dt.datetime.now().isoformat() # ya es str

Asegura el tipo correcto desde el origen.

3) Conversión profunda (si hay anidamientos mixtos)

Si el payload mezcla listas/dicts:

  • Recorre recursivo y castea Timestamp → string (o deja que el encoder lo capture).
  • Añadí logging para imprimir claves problemáticas cuando aparezca el TypeError.

Anti-patrones comunes

  • Confiar solo en astype(str) si hay estructuras fuera de DataFrame.
  • Mutar el payload a mitad de pipeline sin tests de serialización.
  • Exportar sin fijar un formato único (fecha vs datetime) → inconsistencia aguas abajo.

QA mínimo

  • json.dumps(payload, cls=AtlasJSONEncoder) corre sin excepciones.
  • Búsqueda negativa: no debe aparecer "Timestamp(" en el JSON serializado.
  • Si usás fecha-only, testea que todas las claves relevantes cumplan YYYY-MM-DD.

Troubleshooting rápido

  • Sigue fallando: hay un Timestamp en otra rama del objeto → agrega logs o castea esa rama explícitamente.
  • Valores string “raros”: valida timezone awareness y el estándar (fecha-only vs datetime).