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 deDataFrame. - 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
Timestampen 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).