Come correggere un intervallo di tempo con due punti mancanti:Ciao a tutti,
Ho un problema che non mi era mai capitato prima...
Ho un file Excel con 87 colonne di durate che dovrebbero essere nel formato hh:mm
Tuttavia, sono in hhmm o hmm <-- notare il punto e virgola mancante
- Se la durata è inferiore a 10:00, si inseriscono tre cifre (ad esempio, 9:59 si inserisce come 959).
- Se la durata è superiore a 9:59, il numero è composto da quattro cifre (ad esempio, 11:52 si inserisce come 1152).
Potrei gestirlo se si trattasse di 1 o 2 colonne, ma non di 87.
Vedi il file allegato.
Ogni aiuto è molto apprezzato!
Saluti, Christian
Automazione e scriptingUnione e pulizia dei datiOggetto: Come correggere una durata con i due punti mancantiCi sono molte opzioni (penso che tutte queste dovrebbero funzionare)
1. Convertili tutti in stringhe
2. Aggiungi 0 all'inizio
3. Prendi gli ultimi 4 caratteri
4. Inserire :: come terzo carattere
5. Convertili in formato numerico con formattazione della durata
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;
Oppure basta usare i numeri e "convertirli" nel formato orario di 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;
Oggetto: Come correggere una durata con i due punti mancantiL'ultimo metodo può essere eseguito con relativa facilità anche in modalità interattiva tramite JMP.
1. Seleziona tutte le colonne
2. Fare clic con il pulsante destro del mouse sull'intestazione della colonna.
3. Crea una colonna rapida con formule
4. Sostituisci la formula utilizzando lo stile 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. Modificare l'output in Dati in loco

6. Fare clic su "Sostituisci x"
7. Modifica il formato della durata in ore:minuti utilizzando Standardizza attributi, poiché attualmente sono visibili solo i secondi con la formattazione migliore.

8. Dopo aver fatto clic su OK o Applica

E JMP è così gentile da scrivere lo script per te
// 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);
);
Oggetto: Come correggere una durata con due punti mancantiEcco come farei io:
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" );
);
Oggetto: Come correggere una durata con i due punti mancantiCiao Jarmo, grazie mille!
La tua prima sceneggiatura fa miracoli!
Solo che a volte, me ne sono appena reso conto, l'ora viene inserita nel formato hh:mm:ss
Esiste un modo per aggirare anche questo problema? Vedi l'esempio v2.
Saluti, C
PS Ti offro un caffè o una birra la prossima volta che ci vediamo!
Oggetto: Come correggere una durata con i due punti mancantiSi tratta di dati reali (colonne di caratteri con formati diversi)? L'esempio originale, se non ricordo male, conteneva dati numerici. I secondi sono sempre 00 come nell'esempio?
Oggetto: Come correggere una durata con due punti mancantiSì, purtroppo questi dati provengono da fonti reali.
Avevo selezionato due colonne che non presentavano questo problema, pensando di poter semplicemente utilizzare la funzione di ricodifica.
Ma mi sbagliavo, o almeno mi sono reso conto che usare la ricodifica su 84 colonne è troppo per quello che posso sopportare.
Sì, i secondi sono sempre 00.
Oggetto: Come correggere una durata con due punti mancantiFormula per il metodo di calcolo rapido quando le colonne sono di tipo carattere. Questa formula presuppone che i valori già "formattati" come durata abbiano un riempimento di zeri per l'ora (ad esempio 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

Qui creo nuove colonne in modo da poterle confrontare facilmente con il punto di partenza. Dopo aver creato le formule, effettuo le modifiche di tipo necessarie utilizzando gli attributi standardizzati (tipo di dati, tipo di modellazione, formato).

Scopri di più...
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);
);