我想将数字数据转换为时间变量。我有一列带有诸如415、515、1487、1467的值。 我想将这些值转换为04:15、05:15、14:87等格式。 enter image description here 然后,我想从单独的列中提取小时和分钟,例如第一列中的04和另一列中的15””
答案 0 :(得分:1)
同时使用PUT和INPUT时,转换可以在一行中完成。比提取时间和分钟要多。
data have;
do time_as_encoded_number = 415, 515, 1487, 1467, 1022, 1215, 2345;
output;
end;
run;
data want;
set have;
format time_as_SAS_time time5.;
time_as_SAS_time=input(put(time_as_encoded_number,z4.),hhmmss4.);
hour=HOUR(time_as_SAS_time);
minute=MINUTE(time_as_SAS_time);
run;
答案 1 :(得分:0)
Z4
语句中的format
指定如何显示值,而不是如何将其视为数据。 4.
函数调用中的put
指定如何将数字值转换为数字的字符表示形式。在SAS中,与脚本语言不同,变量的类型在数据步骤期间以及保存在输出数据集中时是静态的。最佳做法是从概念上“赋予” sched_dep_time
一个“角色(或类型)并坚持下去”,为小时,分钟和SAS时间的其他角色创建新变量。
data have;
input time_as_encoded_number;
datalines;
415
1022
1215
2345
run;
data want;
set have;
hour = floor(time_as_encoded_number / 100);
minute = mod(time_as_encoded_number , 100);
time_as_SAS_time = DHMS(0,hour,minute,0);
format time_as_SAS_time time5.;
* for demonstration only, causes a NOTE, and goes in circle Num->Char->Num;
length x 8;
x = put (time_as_encoded_number,4.);
run;
注:诸如演示“ {”}的示例可与NOTE:
配合使用,因为它正在绕圈。 put
将数字转换为字符,并且由于left = side = right,所以隐式转换回数字。
length x 8;
x = put (time_as_encoded_number,4.);
答案 2 :(得分:0)
您应该显示出可复制问题的实际源数据,包括您看到的任何错误。我假设您有一个名为sched_dep_time
的数字变量,并且希望将小时和分钟值转换为另外两个数字变量。正如Richard所建议的,您可以使用modulo arithmetic来做到这一点:
data want;
set have;
* Get the integer number of hours by dividing by 100;
hours = int(sched_dep_time / 100);
* Get the number of minutes by getting the remainder after dividing by 100;
minutes = mod(sched_dep_time, 100);
run;