Comment corriger une durée avec un deux-points manquant :Salut tout le monde,
J'ai un problème que je n'ai jamais rencontré auparavant...
J'ai un fichier Excel avec 87 colonnes de durées au format hh:mm.
Cependant, ils sont dans hmm ou hmm <-- notez le : manquant
- Si la durée est inférieure à 10:00, elle s'écrit avec trois chiffres (9:59 s'écrit 959).
- Si la durée est supérieure à 9:59, elle comporte quatre chiffres (11:52 s'écrit 1152).
Je pourrais gérer ça s'il y avait 1 ou 2 colonnes, mais pas 87.
Voir le fichier joint.
Toute aide est grandement appréciée !
À votre santé, Christian
Automatisation et scriptageFusion et nettoyage des donnéesRe: Comment corriger une durée avec un deux-points manquant :De nombreuses options (je pense qu'elles devraient toutes fonctionner)
1. Convertissez-les tous en chaînes de caractères.
2. Ajouter 0 au début
3. Prenez les 4 derniers caractères
4. Insérez ":" comme troisième caractère
5. Convertissez-les en format numérique avec mise en forme de la durée.
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");
);
Ou
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;
Ou utilisez simplement les nombres et « convertissez-les » au format horaire 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: Comment corriger une durée avec un deux-points manquant :Et la dernière méthode peut également être mise en œuvre assez facilement de manière interactive depuis JMP.
1. Sélectionnez toutes les colonnes
2. Faites un clic droit sur l'en-tête de colonne.
3. Créer une colonne de formule rapide
4. Remplacez la formule en utilisant le style relatif
h = Floor(_relative_from_Col 1 / 100);
m = Mod(_relative_from_Col 1, 100);
t = h * In Hours(1) + m * In Minutes(1);
5. Modifier la sortie en données sur place

6. Cliquez sur « Remplacer x »
7. Modifiez le format en durée h:m en utilisant Standardiser les attributs, car actuellement seules les secondes sont visibles avec le formatage optimal.

8. Après avoir cliqué sur OK ou Appliquer

Et JMP a la gentillesse d'écrire le script pour vous.
// 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: Comment corriger une durée avec un deux-points manquant :Voici comment je procéderais :
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: Comment corriger une durée avec un deux-points manquant :Salut Jarmo, merci beaucoup !
Votre premier script est magique !
Sauf que parfois, je viens de m'en rendre compte, l'heure est saisie au format hh:mm:ss
Existe-t-il une autre solution ? Voir l’exemple v2.
À la vôtre, C
PS : Je te dois un café ou une bière la prochaine fois que je te vois !
Re: Comment corriger une durée avec un deux-points manquant :S'agit-il de données réelles (colonnes de caractères avec différents formats) ? L'exemple original contenait des données numériques, si je me souviens bien. Les secondes sont-elles toujours égales à 00, comme dans l'exemple ?
Re: Comment corriger une durée avec un deux-points manquant :Oui, malheureusement, cela provient de données réelles.
J'avais sélectionné deux colonnes qui ne présentaient pas ce problème, car je pensais pouvoir simplement utiliser le recodage.
Mais je me suis trompé, ou du moins j'ai réalisé qu'utiliser la fonction de recodage sur 84 colonnes, c'est trop pour moi.
Oui, les secondes sont toujours à 00.
Re: Comment corriger une durée avec un deux-points manquant :Formule pour la méthode de formule rapide lorsque les colonnes sont de type caractère. Cette formule suppose que les valeurs déjà formatées en durée auront un remplissage nul pour les heures (par exemple : 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

Je crée ici de nouvelles colonnes afin de pouvoir les comparer facilement à la situation initiale. Après avoir créé les formules, j'effectue les modifications de type nécessaires à l'aide des attributs standardisés (type de données, type de modélisation, format).

Voir plus...
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);
);