sas - 在使用 intck 的 SAS 数据区间计算中,通过观察数返回缺失值
问题描述
我正在尝试以$4.00
date9 格式查找两个变量之间的周间隔。
工作示例有两个变量,日期格式为 18JAN2017 和 25FEB2017。我想创建第三个变量,显示符合观察/主题 ID 内这些日期之间间隔的周数。
我试过了:
data test1;
set inputs1;
difference = intck('week',input(date1,date9.),input(date2,date9.));
run;
此代码返回缺失值和 $0 值。我期望一个名为difference
通过观察显示两个日期之间的周数的新变量。
这是格式或语法问题,还是intck
无法处理变量?
解决方案
格式告诉 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;