So korrigieren Sie eine Dauerangabe mit fehlendem Doppelpunkt:Hallo zusammen,
Ich habe ein Problem, das mir bisher noch nie begegnet ist...
Ich habe eine Excel-Datei mit 87 Spalten, die Zeitangaben im Format hh:mm enthalten.
Allerdings befinden sie sich in hhmm oder hmm <-- beachten Sie das fehlende :
- Beträgt die Dauer weniger als 10:00 Minuten, wird sie dreistellig angegeben (9:59 wird als 959 eingegeben).
- Beträgt die Dauer mehr als 9:59, wird sie vierstellig angegeben (11:52 wird als 1152 eingegeben).
Das könnte ich noch verkraften, wenn es nur 1 oder 2 Spalten wären, aber nicht 87.
Siehe beigefügte Datei.
Jede Hilfe wird sehr geschätzt!
Viele Grüße, Christian
Automatisierung und SkripterstellungDatenzusammenführung und -bereinigungBetreff: Wie korrigiert man eine Dauerangabe mit fehlendem Doppelpunkt?Zahlreiche Optionen (ich denke, alle sollten funktionieren)
1. Wandeln Sie alle in Zeichenketten um.
2. Füge 0 zum Anfang hinzu.
3. Nimm die letzten 4 Zeichen
4. Fügen Sie ":" als drittes Zeichen ein.
5. Konvertieren Sie sie in numerische Werte mit Dauerformatierung.
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");
);
Oder
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;
Oder man verwendet einfach die Zahlen und „konvertiert“ sie in das JMP-Zeitformat.
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;
Betreff: Wie korrigiert man eine Dauerangabe mit fehlendem Doppelpunkt?Und die letzte Methode lässt sich auch ganz einfach interaktiv über JMP durchführen.
1. Alle Spalten auswählen
2. Klicken Sie mit der rechten Maustaste auf die Spaltenüberschrift.
3. Formel-Schnellspalte erstellen
4. Ersetzen Sie die Formel durch die relative Formatierung.
h = Floor(_relative_from_Col 1 / 100);
m = Mod(_relative_from_Col 1, 100);
t = h * In Hours(1) + m * In Minutes(1);
5. Ändern Sie die Ausgabe auf In-Place-Daten.

6. Klicken Sie auf „x ersetzen“.
7. Ändern Sie das Format in Dauer Std.:Min. mithilfe von „Attribute standardisieren“, da derzeit nur die Sekunden mit der optimalen Formatierung angezeigt werden.

8. Nach dem Klicken auf OK oder Anwenden

Und JMP ist so nett, dass es ein Skript für Sie schreibt.
// 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);
);
Betreff: Wie korrigiert man eine Dauerangabe mit fehlendem Doppelpunkt?So würde ich es machen:
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" );
);
Betreff: Wie korrigiert man eine Dauerangabe mit fehlendem Doppelpunkt?Hallo Jarmo, vielen Dank!
Ihr erstes Drehbuch wirkt Wunder!
Nur dass die Zeit manchmal, wie mir gerade aufgefallen ist, im Format hh:mm:ss eingegeben wird.
Gibt es dafür auch eine Möglichkeit? Siehe Beispiel v2.
Viele Grüße, C
PS: Ich schulde dir einen Kaffee oder ein Bier, wenn wir uns das nächste Mal sehen!
Betreff: Wie korrigiert man eine Dauerangabe mit fehlendem Doppelpunkt?Handelt es sich um reale Daten (Zeichenspalten mit unterschiedlichen Formaten)? Das Originalbeispiel enthielt, wenn ich mich recht erinnere, numerische Daten. Sind die Sekunden immer 00, wie im Beispiel?
Betreff: Wie korrigiert man eine Dauerangabe mit fehlendem Doppelpunkt?Ja, leider stammen diese Daten aus der Praxis.
Ich hatte zwei Spalten ausgewählt, bei denen dieses Problem nicht auftrat, da ich dachte, ich könnte einfach recode verwenden.
Aber ich habe mich geirrt, oder zumindest habe ich erkannt, dass die Verwendung von Recode auf 84 Spalten zu viel für meine Verhältnisse ist.
Ja, die Sekunden sind immer 00.
Betreff: Wie korrigiert man eine Dauerangabe mit fehlendem Doppelpunkt?Formel für die Schnellformelmethode bei Zeichenspalten. Dabei wird angenommen, dass bereits als Dauer formatierte Werte mit führenden Nullen für die Stunde aufgefüllt werden (z. B. 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

Ich erstelle hier neue Spalten, um sie leicht mit dem Ausgangspunkt vergleichen zu können. Nach dem Erstellen der Formeln nehme ich die erforderlichen Typänderungen mithilfe standardisierter Attribute (Datentyp, Modelltyp, Format) vor.

Mehr anzeigen...
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);
);