Cómo corregir una duración con dos puntos faltantes:Hola a todos,
Tengo un problema que no había encontrado antes...
Tengo un archivo de Excel con 87 columnas de duraciones que deben estar en formato hh:mm.
Sin embargo, están en hhmm o hmm <-- observe lo que falta :
- Si la duración es inferior a 10:00, se introduce como tres cifras (9:59 se introduce como 959).
- Si la duración es superior a 9:59, se introduce como cuatro cifras (11:52 se introduce como 1152).
Puedo manejar esto si fueran 1 o 2 columnas, pero no 87.
Ver archivo adjunto.
¡Toda ayuda es muy apreciada!
Saludos, Christian
Automatización y secuencias de comandosCombinación y limpieza de datosRe: Cómo corregir una duración con dos puntos faltantes:Hay muchas opciones (creo que todas deberían funcionar).
1. Conviértelos todos a cadenas de texto.
2. Suma 0 al inicio
3. Toma los últimos 4 caracteres.
4. Inserta ":" como tercer carácter
5. Conviértalos a formato numérico con duración.
Names Default To Here(1);
dt = Current Data Table();
cols = dt << Get Column Names("String");
For Each({colname}, cols,
Column(dt, colname) << Set Data Type("Character");
Eval(EvalExpr(
dt << Apply Formula(
Columns(Expr(NameExpr(AsColumn(dt, colname)))),
Formula(
s = Right("0" || Expr(NameExpr(AsColumn(dt, colname))), 4);
Left(s, 2) ||":"||Right(s,2)
),
Output("In Place")
) << Run Formulas;
));
);
For Each({colname}, cols,
Column(dt, colname) << Set Data Type(Numeric, Format("hr:m", 30), Input Format("hr:m")) << Set Modeling Type("Continuous");
);
O
Names Default To Here(1);
dt = Current Data Table();
cols = dt << Get Column Names("String");
dt << Begin Data Update;
For Each({colname}, cols,
For Each Row(dt,
s = Char(Column(dt, colname)[]);
If(Column(dt, colname)[] < 1000,
s = "0" || s
);
Column(dt, colname)[] = In Format(Left(s, 2) || ":" || Right(s, 2), "hr:m");
);
Column(dt, colname) << Format("hr:m", 30);
);
dt << End Data Update;
O simplemente use los números y "conviértalos" al formato de hora de JMP.
Names Default To Here(1);
dt = Current Data Table();
cols = dt << Get Column Names("String");
dt << Begin Data Update;
For Each({colname}, cols,
For Each Row(dt,
val = Column(dt, colname)[];
h = Floor(val / 100);
m = Mod(val, 100);
t = h * In Hours(1) + m * In Minutes(1);
Column(dt, colname)[] = t;
);
Column(dt, colname) << Format("hr:m", 30);
);
dt << End Data Update;
Re: Cómo corregir una duración con dos puntos faltantes:Y el último método también se puede realizar fácilmente de forma interactiva desde JMP.
1. Seleccione todas las columnas
2. Haga clic con el botón derecho en el encabezado de la columna.
3. Crear columna rápida de fórmula
4. Reemplace la fórmula utilizando el estilo relativo.
h = Floor(_relative_from_Col 1 / 100);
m = Mod(_relative_from_Col 1, 100);
t = h * In Hours(1) + m * In Minutes(1);
5. Cambiar la salida a Datos en contexto

6. Haga clic en "Reemplazar x"
7. Cambia el formato a duración hr:m usando Estandarizar atributos, ya que actualmente solo se muestran los segundos con el formato Mejor.

8. Después de hacer clic en Aceptar o Aplicar

Y JMP es lo suficientemente amable como para escribir el script por ti.
// Transform column
Data Table("example for JMP com") << Apply Formula(
Columns(Group(:Col 1, 2), Ref("_relative_from_Col 1")),
Formula(
h = Floor(_relative_from_Col 1 / 100);
m = Mod(_relative_from_Col 1, 100);
t = h * In Hours(1) + m * In Minutes(1);
),
Output("In Place")
) << Run Formulas;
// Standardize column attributes
Local({old dt = Current Data Table()},
Current Data Table(Data Table("example for JMP com"));
For Each({col, index}, {:Col 1, :Col 2}, col << Format("hr:m", 10));
Current Data Table(old dt);
);
Re: Cómo corregir una duración con dos puntos faltantes:Así es como yo lo haría:
Names Default To Here( 1 );
dt = Current Data Table();
colNames = dt << get column names( contiuous, string );
For Each( {col}, colNames,
Show( col );
For Each Row(
As Column( col ) = Informat(
Substr( Char( As Column( Col ) ), 1, Length( Char( As Column( Col ) ) ) - 2 ) || ":" ||
Substr( Char( As Column( Col ) ), Length( Char( As Column( Col ) ) ) - 1, 2 ),
"hr:m"
)
);
column(dt,col) << format( "hr:m" );
);
Re: Cómo corregir una duración con dos puntos faltantes:Hola Jarmo, ¡muchísimas gracias!
¡Tu primer guion hace maravillas!
Excepto que a veces, me acabo de dar cuenta, la hora se introduce como hh:mm:ss
¿Existe alguna forma de solucionar esto también? Ver ejemplo v2.
Saludos, C
PD: ¡Te debo un café o una cerveza la próxima vez que te vea!
Re: Cómo corregir una duración con dos puntos faltantes:¿Se trata de datos reales (columnas de caracteres con diferentes formatos)? Si no recuerdo mal, el ejemplo original contenía datos numéricos. ¿Los segundos son siempre 00, como en el ejemplo?
Re: Cómo corregir una duración con dos puntos faltantes:Sí, lamentablemente, estos datos son reales.
Había seleccionado dos columnas que no presentaban este problema, ya que pensé que simplemente podría usar la función de recodificación.
Pero me equivoqué, o al menos me di cuenta de que usar la función de recodificación en 84 columnas es demasiado para lo que puedo soportar.
Sí, los segundos siempre son 00.
Re: Cómo corregir una duración con dos puntos faltantes:Fórmula para el método de fórmula rápida cuando las columnas son de tipo carácter. Se asume que los valores que ya tienen formato de duración tendrán relleno de ceros para la hora (por ejemplo, 0 9:00:00).
numonly = Substitute(_relative_from_X__1, ":", ""); // remove ":"
hrm = Left(numonly, 4); // take 4 characters from left
val = Num(hrm); // convert to numeric for calculations
h = Floor(val / 100); // take only hundreds
m = Mod(val, 100); // remainder
t = h * 60*60 + m * 60; // convert to seconds

Creo nuevas columnas aquí para poder compararlas fácilmente con el punto de partida. Después de crear las fórmulas, realizo los cambios de tipo necesarios utilizando atributos estandarizados (tipo de datos, tipo de modelado, formato).

Ver más...
This will create new data columns, you might want to use in place data instead
// Transform column
Data Table("example for JMP com v2") << Apply Formula(
Columns(Group(:X__1, 12), Ref("_relative_from_X__1")),
Formula(
numonly = Substitute(_relative_from_X__1, ":", "");
hrm = Left(numonly, 4);
val = Num(hrm);
h = Floor(val / 100);
m = Mod(val, 100);
t = h * 60 * 60 + m * 60;
),
Output(New Static)
) << Run Formulas;
// Standardize column attributes
Local({old dt = Current Data Table()},
Current Data Table(Data Table("example for JMP com v2"));
For Each({col, index},
{:X__1 2, :X__2 2, :X__3 2, :X__4 2, :X__5 2, :X__6 2, :X__7 2, :X__8 2,
:X__9 2, :X__10 2, :X__11 2, :X__12 2},
col << Set Data Type(Numeric, Format("Best", 12))
);
Current Data Table(old dt);
);
// Standardize column attributes
Local({old dt = Current Data Table()},
Current Data Table(Data Table("example for JMP com v2"));
For Each({col, index},
{:X__1 2, :X__2 2, :X__3 2, :X__4 2, :X__5 2, :X__6 2, :X__7 2, :X__8 2,
:X__9 2, :X__10 2, :X__11 2, :X__12 2},
col << Set Modeling Type("Continuous")
);
Current Data Table(old dt);
);
// Standardize column attributes
Local({old dt = Current Data Table()},
Current Data Table(Data Table("example for JMP com v2"));
For Each({col, index},
{:X__1 2, :X__2 2, :X__3 2, :X__4 2, :X__5 2, :X__6 2, :X__7 2, :X__8 2,
:X__9 2, :X__10 2, :X__11 2, :X__12 2},
col << Format("hr:m", 12)
);
Current Data Table(old dt);
);