如何修复缺少冒号的持续时间:大家好,
我遇到了一个以前从未遇到过的问题……
我有一个 Excel 文件,其中包含 87 列持续时间数据,格式为 hh:mm。
然而,它们处于 hhmm 或 hmm <-- 注意缺少冒号:
- 如果时长小于 10:00,则用三位数表示(例如,9:59 输入为 959)。
- 如果时长超过 9 分 59 秒,则为四位数(例如,11 分 52 秒输入为 1152)。
如果是 1 列或 2 列,我可以应付,但 87 列就应付不了了。
请查看附件。
非常感谢您的帮助!
克里斯蒂安,你好。
自动化和脚本编写数据融合与清理回复:如何修复缺少冒号的持续时间:有很多选择(我觉得这些应该都可行)。
1. 将它们全部转换为字符串
2. 在起始位置加 0
3. 取最后 4 个字符
4. 插入“:”作为第三个字符
5. 将它们转换为数值,并设置持续时间格式
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");
);
或者
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;
或者直接使用这些数字,然后将它们“转换”成 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;
回复:如何修复缺少冒号的持续时间:最后一种方法也可以通过 JMP 以交互方式轻松完成。
1. 选择所有列
2. 右键单击列标题
3. 创建公式快速列
4. 使用相对样式替换公式
h = Floor(_relative_from_Col 1 / 100);
m = Mod(_relative_from_Col 1, 100);
t = h * In Hours(1) + m * In Minutes(1);
5. 将输出更改为就地数据

6. 点击“替换 x”
7. 使用“标准化属性”将持续时间格式更改为“小时:分钟”,因为目前使用“最佳格式”时仅显示秒数。

8. 点击“确定”或“应用”后

JMP 还很贴心地为你编写脚本。
// 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);
);
回复:如何修复缺少冒号的持续时间:我的做法是这样的:
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" );
);
回复:如何修复缺少冒号的持续时间:嗨,Jarmo,非常感谢!
你的第一个剧本就产生了奇效!
但我刚刚发现,有时候时间是以 hh:mm:ss 的格式输入的。
是否有其他方法可以解决这个问题?请参见示例 v2。
祝好,C
PS:下次见到你我请你喝咖啡或啤酒!
回复:如何修复缺少冒号的持续时间:如果这是来自真实数据(不同格式的字符列)的话?如果我没记错的话,原始示例是数值型数据。秒数是否始终为 00,就像示例中那样?
回复:如何修复缺少冒号的持续时间:是的,很遗憾,这是真实数据。
我选择了两个没有这个问题的列,因为我以为可以用重新编码的方式解决。
但我错了,或者至少我意识到对 84 列使用 recode 对我来说负担太重了。
是的,秒数始终为 00。
回复:如何修复缺少冒号的持续时间:当列为字符列时,可以使用快速公式方法计算公式。此公式假设已格式化的持续时间值会在小时部分填充零(例如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

我在这里创建新列,以便轻松地将它们与初始值进行比较。创建公式后,使用标准化属性(数据类型、建模类型、格式)进行必要的类型更改。

查看更多...
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);
);