Corrige fechas con KNIME+Python

El problema no poco frecuente de arreglar formatos de fechas que no son comunes y originadas por reportes de aplicaciones propias.

En un resultado de informe con diferentes tipos de campos de fecha de tipo «27/sep/22 9:45 AM» y «2023-01-24 17:30:56.432» y sumando además valores en «blanco». Una pesadilla para homogeneizar. Ni Excel, ni Power BI ni LibreOffice pudieron con el reto de reconocer y adoptar estos formatos de fecha desde un string.

La verdad que KNIME tampoco me dió resultados muy satisfactorios, pero, agregando Python logré obtener un flujo que lograra varias cosas:

  • Completar los nulos con valores aceptables
  • Transformar el formato de fecha a «27-sep-22»
  • Volver a transformar las fechas a un formato mas estándar «2023-01-23»
  • Exportar los resultados a una planilla
import knime_io as knio
import pandas as pd
import datetime

# Load the first input table.
df = knio.input_tables[0].to_pandas()

def mestn(string):
# string = '25-ene-22'
    months = {
        'ene': '01',
        'feb': '02',
        'mar': '03',
        'abr': '04',
        'may': '05',
        'jun': '06',
        'jul': '07',
        'ago': '08',
        'sep': '09',
        'oct': '10',
        'nov': '11',
        'dic': '12'
    }
    if not string:
        string = '01-ene-10'
    else:
        string = string
        
    s = string[3:6]
    try:
        out = months[s]
        newdate = string[0:3]+out+string[6:10]
        return newdate
    except:
        return ''

## Change months name to number using mestn function
format = '%d-%m-%y' # original value "25-ene-22"

df["Creada"] = df["Creada"].apply(mestn)
df["Actualizada"] = df["Actualizada"].apply(mestn)
df["Vista"] = df["Vista"].apply(mestn)
df["Resuelta"] = df["Resuelta"].apply(mestn)

# change column type to date
df["Creada"] = pd.to_datetime(df["Creada"], format= format).dt.date
df["Actualizada"] = pd.to_datetime(df["Actualizada"], format= format).dt.date
df["Vista"] = pd.to_datetime(df["Vista"], format= format).dt.date
df["Resuelta"] = pd.to_datetime(df["Resuelta"], format= format, errors='coerce').dt.date

format = '%Y-%m-%d'
df["Respuesta"] = pd.to_datetime(df["Respuesta"], format= format).dt.date

# Pass the transformed table to the first output port of the node.
knio.output_tables[0] = knio.write_table(df)