从数值到时间值

时间:2019-04-18 09:51:46

标签: sas

我想将数字数据转换为时间变量。我有一列带有诸如415、515、1487、1467的值。 我想将这些值转换为04:15、05:15、14:87等格式。 enter image description here  然后,我想从单独的列中提取小时和分钟,例如第一列中的04和另一列中的15””

3 个答案:

答案 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;