【问题标题】:In SAS data interval calculation with intck by observationnumber returning missing values在使用 intck 的 SAS 数据区间计算中,通过观察编号返回缺失值
【发布时间】:2019-01-11 07:05:50
【问题描述】:

我试图找出两个日期9 格式的$4.00 变量之间的间隔(以周为单位)。

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

我试过了:

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

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

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

【问题讨论】:

  • 请为date1date2 添加示例值,以使您的示例更具重现性。
  • 将日志中的消息添加到您的问题中。他们应该提供有关问题的信息。
  • $4.00 变量是什么意思?
  • 查看变量内容时,两个日期变量都列为数字 date9。

标签: sas


【解决方案1】:

格式告诉 SAS 在查看值时如何呈现它。该格式不会改变基础价值。因此,如果变量 date1 的格式为 date9.,则意味着该变量是数字的,其值代表 SAS 日期纪元中的日期值(0 是 1960 年 1 月 1 日)。因此,不应将数值传递给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;

【讨论】:

  • 当我做 intck ('WEEK' , date1 ,date2);我得到了预期的结果。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
相关资源
最近更新 更多