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)