首页 > 解决方案 > 在使用 intck 的 SAS 数据区间计算中,通过观察数返回缺失值

问题描述

我正在尝试以$4.00date9 格式查找两个变量之间的周间隔。

工作示例有两个变量,日期格式为 18JAN2017 和 25FEB2017。我想创建第三个变量,显示符合观察/主题 ID 内这些日期之间间隔的周数。

我试过了:

  data test1;
  set inputs1;    
  difference = intck('week',input(date1,date9.),input(date2,date9.));
  run;

此代码返回缺失值和 $0 值。我期望一个名为difference通过观察显示两个日期之间的周数的新变量。

这是格式或语法问题,还是intck无法处理变量?

标签: sas

解决方案


格式告诉 SAS 在查看值时如何呈现它。该格式不会改变基础价值。因此,如果变量date1被格式化date9.,这意味着变量是数字的,则采用表示 SAS 日期纪元中的日期值的值(0 是 01-JAN-1960)。因此,不应将数值传递给INPUT.

字符变量可以有一个构造为 的值ddMONyyyy。该变量不会被格式化date9. 字符值将是日期值的格式化表示,并且必须传递INPUT以获取对应于 SAS 纪元中日期的数值。

intck最肯定可以处理变量——实际上它处理任何计算(隐式或显式)为数字的表达式。包含格式化日期表示的字符串不能隐式评估为 SAS 编号,它必须通过input.

通过的格式化数字INPUT是不正确的。数值将进入INPUT函数隐式未格式化并转换为字符串,“数字”将根据指定的信息进行解析,但这样做会失败。

以下是一些探索上述叙述的示例代码:

data _null_;

  today = today();
  tomorrow = today + 1;

  diff = intck ('day', today, tomorrow);

  put today tomorrow diff;

  date1num_as_char = '21560';
  date2num_as_char = '21561';

  diff = intck ('day', date1num_as_char, date2num_as_char);

  put date1num_as_char date2num_as_char diff;

  date1_as_string = '11JAN2019';  * not a SAS date value, is a date representation;
  date2_as_string = '12JAN2019';

  diff = intck ('day', date1_as_string, date2_as_string);

  put date1_as_string date2_as_string diff;

  now = today();
  format now date9.;

  put now=;

  now_through_input = input(now,date9.); * just wrong;
  put now_through_input=;
run;

推荐阅读