【问题标题】:How to format dates for use in SAS?如何格式化日期以在 SAS 中使用?
【发布时间】:2020-10-02 12:33:51
【问题描述】:

我正在尝试调整本文中的方法 4 来计算许多观察的持续时间,但不考虑重叠日期:https://support.sas.com/resources/papers/proceedings/proceedings/sugi31/048-31.pdf

例如,对象 101 的两行观察值分别从 2017-03-02 到 2017-03-16 和 2017-03-04 到 2017-03-17 应返回仅 16 天的值。

但是,我收到一个错误,日期为“无效的数字数据”,导致后来的错误。我试过format startdate yyyymmdd10.;format stopdate yyyymmdd10.; 都没有成功。

谁能帮我正确格式化我的日期以供在这里使用,或找出任何进一步的错误?

编辑:第 80 行指的是do xdate = startdate to stopdate;

我仍然无法将日期变量转换或创建为数字/日期值。我使用了以下代码:

data sasuser.Mdm;
set sasuser.Mdm; 
do xdate = input(Startdate,yymmdd10.) to input(stopdate,yymmdd10.);
    put xdate= yymmdd10.; 
output;
end;
run;

要得到这个输出:

1    data sasuser.Mdm;
2    set sasuser.Mdm;
3    do xdate = input(Startdate,yymmdd10.) to input(stopdate,yymmdd10.);
4        put xdate= yymmdd10.;
5    output;
6    end;
7    run;

xdate=2017-03-02
xdate=2017-03-03
xdate=2017-03-04
xdate=2017-03-05
xdate=2017-03-06
xdate=2017-03-07
xdate=2017-03-08
xdate=2017-03-09
xdate=2017-03-10
xdate=2017-03-11
xdate=2017-03-12
xdate=2017-03-13
xdate=2017-03-14
xdate=2017-03-15
xdate=2017-03-16
xdate=2017-03-04
xdate=2017-03-05
xdate=2017-03-06
xdate=2017-03-07
xdate=2017-03-08
xdate=2017-03-09
xdate=2017-03-10
xdate=2017-03-11
xdate=2017-03-12
xdate=2017-03-13
xdate=2017-03-14
xdate=2017-03-15
xdate=2017-03-16
xdate=2017-03-17
xdate=2017-03-07
xdate=2017-03-08
xdate=2017-03-09
xdate=2017-03-10
xdate=2017-03-11
xdate=2017-03-12
xdate=2017-03-13
xdate=2017-03-14
xdate=2017-03-15
xdate=2017-03-16
xdate=2017-03-17
xdate=2017-03-18
xdate=2017-03-19
xdate=2017-03-20
xdate=2017-03-21
xdate=2017-02-08
xdate=2017-02-09
xdate=2017-02-10
xdate=2017-02-11
xdate=2017-02-12
xdate=2017-02-13
xdate=2017-02-14
xdate=2017-02-15
xdate=2017-02-16
xdate=2017-02-17
xdate=2017-02-18
xdate=2017-02-19
xdate=2017-02-20
xdate=2017-02-21
xdate=2017-02-22
xdate=2017-02-23
xdate=2017-02-24
xdate=2017-02-23
xdate=2017-02-24
xdate=2017-02-25
xdate=2017-02-26
xdate=2017-02-27
xdate=2017-02-28
xdate=2017-03-01
xdate=2017-03-02
xdate=2017-03-03
xdate=2017-03-04
xdate=2017-03-05
xdate=2017-03-06
xdate=2017-03-07
xdate=2017-03-08
xdate=2017-02-26
xdate=2017-02-28
xdate=2017-03-13
xdate=2017-03-17
xdate=2017-03-25
xdate=2017-03-28
xdate=2017-03-23
xdate=2017-03-24
xdate=2017-03-25
xdate=2017-03-26
xdate=2017-03-27
xdate=2017-03-28
xdate=2017-03-29
xdate=2017-03-30
xdate=2017-03-29
xdate=2017-04-03
xdate=2017-04-04
xdate=2017-04-03
xdate=2017-04-04
xdate=2017-04-05
xdate=2017-04-05
xdate=2017-04-06
xdate=2017-04-06
xdate=2017-04-07
xdate=2017-03-25
xdate=2017-03-26
xdate=2017-03-30
xdate=2017-04-01
xdate=2017-04-02
xdate=2017-04-03
xdate=2017-04-04
xdate=2017-04-08
xdate=2017-04-09
xdate=2017-04-10
xdate=2017-04-11
xdate=2017-04-12
xdate=2017-04-12
xdate=2017-04-13
xdate=2017-04-13
xdate=2017-04-14
xdate=2017-04-15
xdate=2017-04-16
xdate=2017-04-17
xdate=2017-04-18
xdate=2017-04-19
xdate=2017-04-20
xdate=2017-04-21
xdate=2017-04-22
xdate=2017-04-19
xdate=2017-04-23
xdate=2017-04-24
xdate=2017-04-25
xdate=2017-04-26
xdate=2017-04-26
xdate=2017-04-27
xdate=2017-04-28
xdate=2017-05-05
xdate=2017-05-06
xdate=2017-05-16
xdate=2017-05-19
xdate=2017-05-20
xdate=2017-05-21
xdate=2017-05-22
xdate=2017-05-19
xdate=2017-05-20
xdate=2017-05-21
xdate=2017-05-22
xdate=2017-05-23
xdate=2017-05-24
xdate=2017-05-25
xdate=2017-05-26
xdate=2017-05-22
xdate=2017-05-23
xdate=2017-05-24
xdate=2017-05-25
xdate=2017-05-26
xdate=2017-05-27
xdate=2017-05-28
xdate=2017-05-29
xdate=2017-05-30
xdate=2017-05-31
xdate=2017-06-01
xdate=2017-06-02
xdate=2017-06-03
xdate=2017-06-04
xdate=2017-06-05
xdate=2017-06-06
xdate=2017-06-07
xdate=2017-06-08
xdate=2017-06-09
xdate=2017-06-10
xdate=2017-06-11
xdate=2017-06-12
xdate=2017-06-13
xdate=2017-06-14
xdate=2017-06-15
xdate=2017-06-16
xdate=2017-06-17
xdate=2017-06-18
xdate=2017-06-19
xdate=2017-06-20
xdate=2017-06-21
xdate=2017-06-22
xdate=2017-06-23
xdate=2017-06-24
xdate=2017-06-25
xdate=2017-06-26
xdate=2017-06-27
xdate=2017-06-28
xdate=2017-06-29
xdate=2017-06-30
xdate=2017-07-01
xdate=2017-07-02
xdate=2017-07-03
xdate=2017-07-04
xdate=2017-07-05
xdate=2017-07-06
xdate=2017-07-07
xdate=2017-07-08
xdate=2017-07-09
xdate=2017-07-10
xdate=2017-07-11
xdate=2017-07-12
xdate=2017-07-13
xdate=2017-07-14
xdate=2017-07-15
xdate=2017-07-16
xdate=2017-07-17
xdate=2017-07-18
xdate=2017-07-19
xdate=2017-07-20
xdate=2017-07-21
xdate=2017-07-22
xdate=2017-07-23
xdate=2017-07-24
xdate=2017-07-25
xdate=2017-07-26
xdate=2017-07-27
xdate=2017-07-28
xdate=2017-07-29
xdate=2017-07-30
xdate=2017-07-31
xdate=2017-08-01
xdate=2017-08-02
xdate=2017-08-03
xdate=2017-08-04
xdate=2017-08-05
xdate=2017-08-06
xdate=2017-08-07
xdate=2017-08-08
xdate=2017-08-09
xdate=2017-08-10
xdate=2017-08-11
xdate=2017-08-12
xdate=2017-08-13
xdate=2017-08-14
xdate=2017-08-15
xdate=2017-08-16
xdate=2017-08-17
xdate=2017-08-18
xdate=2017-08-19
xdate=2017-08-20
xdate=2017-08-21
xdate=2017-08-22
xdate=2017-08-23
xdate=2017-08-24
xdate=2017-08-25
xdate=2017-08-26
xdate=2017-08-27
xdate=2017-08-28
xdate=2017-08-29
xdate=2017-08-30
xdate=2017-08-31
xdate=2017-09-01
xdate=2017-05-27
xdate=2017-05-28
xdate=2017-05-29
xdate=2017-05-30
xdate=2017-05-31
xdate=2017-06-01
xdate=2017-06-02
xdate=2017-06-03
xdate=2017-06-04
xdate=2017-06-05
xdate=2017-06-06
xdate=2017-06-07
xdate=2017-06-08
xdate=2017-06-09
xdate=2017-06-10
xdate=2017-06-11
xdate=2017-06-12
xdate=2017-06-13
xdate=2017-06-14
xdate=2017-06-15
xdate=2017-06-16
xdate=2017-06-17
xdate=2017-06-18
xdate=2017-06-19
xdate=2017-06-20
xdate=2017-06-21
xdate=2017-06-22
xdate=2017-06-23
xdate=2017-06-24
xdate=2017-06-25
xdate=2017-06-26
xdate=2017-06-27
xdate=2017-06-28
xdate=2017-06-29
xdate=2017-06-30
xdate=2017-07-01
xdate=2017-07-02
xdate=2017-07-03
xdate=2017-07-04
xdate=2017-07-05
xdate=2017-07-06
xdate=2017-07-07
xdate=2017-07-08
xdate=2017-07-09
xdate=2017-07-10
xdate=2017-07-11
xdate=2017-07-12
xdate=2017-07-13
xdate=2017-07-14
xdate=2017-07-15
xdate=2017-07-16
xdate=2017-07-17
xdate=2017-07-18
xdate=2017-07-19
xdate=2017-07-20
xdate=2017-07-21
xdate=2017-07-22
xdate=2017-07-23
xdate=2017-07-24
xdate=2017-07-25
xdate=2017-07-26
xdate=2017-07-27
xdate=2017-07-28
xdate=2017-07-29
xdate=2017-07-30
xdate=2017-07-31
xdate=2017-08-01
xdate=2017-08-02
xdate=2017-08-03
xdate=2017-08-04
xdate=2017-08-05
xdate=2017-08-06
xdate=2017-08-07
xdate=2017-08-08
xdate=2017-08-09
xdate=2017-08-10
xdate=2017-08-11
xdate=2017-08-12
xdate=2017-08-13
xdate=2017-08-14
xdate=2017-08-15
xdate=2017-08-16
xdate=2017-08-17
xdate=2017-08-18
xdate=2017-08-19
xdate=2017-08-20
xdate=2017-08-21
xdate=2017-08-22
xdate=2017-08-23
xdate=2017-08-24
xdate=2017-08-25
xdate=2017-08-26
xdate=2017-08-27
xdate=2017-08-28
xdate=2017-08-29
xdate=2017-08-30
xdate=2017-08-31
xdate=2017-09-01
xdate=2017-06-14
xdate=2017-06-15
xdate=2017-06-16
xdate=2017-06-17
xdate=2017-06-18
xdate=2017-06-19
xdate=2017-06-20
xdate=2017-06-21
xdate=2017-06-22
xdate=2017-06-23
xdate=2017-06-24
xdate=2017-06-25
xdate=2017-06-26
xdate=2017-06-27
xdate=2017-06-28
xdate=2017-06-29
xdate=2017-06-14
xdate=2017-06-15
xdate=2017-06-16
xdate=2017-06-17
xdate=2017-06-18
xdate=2017-06-19
xdate=2017-06-20
xdate=2017-06-21
xdate=2017-06-22
xdate=2017-06-23
xdate=2017-06-24
xdate=2017-06-25
xdate=2017-06-26
xdate=2017-06-27
xdate=2017-06-28
xdate=2017-06-29
xdate=2017-03-27
xdate=2017-04-02
xdate=2017-04-07
xdate=2017-04-08
xdate=2017-04-09
xdate=2017-04-13
xdate=2017-04-14
xdate=2017-04-15
xdate=2017-04-16
xdate=2017-04-17
xdate=2017-04-19
xdate=2017-04-20
xdate=2017-04-21
xdate=2017-04-22
xdate=2017-04-23
xdate=2017-04-24
xdate=2017-04-20
xdate=2017-04-21
xdate=2017-04-22
xdate=2017-04-23
xdate=2017-04-24
xdate=2017-04-25
xdate=2017-04-26
xdate=2017-04-27
xdate=2017-04-28
xdate=2017-04-29
xdate=2017-04-30
xdate=2017-05-01
xdate=2017-05-02
xdate=2017-04-24
xdate=2017-04-25
xdate=2017-04-26
xdate=2017-04-27
xdate=2017-04-28
xdate=2017-04-29
xdate=2017-04-30
xdate=2017-05-01
xdate=2017-05-02
xdate=2017-05-03
xdate=2017-05-04
xdate=2017-05-05
xdate=2017-05-06
xdate=2017-05-07
xdate=2017-05-08
xdate=2017-05-09
xdate=2017-05-10
xdate=2017-05-11
xdate=2017-05-12
xdate=2017-05-13
xdate=2017-05-14
xdate=2017-05-15
xdate=2017-05-16
ERROR: Invalid DO loop control information, either the INITIAL or TO expression is missing or the
       BY expression is missing, zero, or invalid.
SUBJID=106 KEY=106-9 OBS=9 TOTAL=12 STARTDATE=2017-04-25 STOPDATE=  CLASS=Steroid / Diuretic
xdate=20934 _ERROR_=1 _N_=52
NOTE: The SAS System stopped processing this step because of errors.
NOTE: There were 52 observations read from the data set SASUSER.MDM.
WARNING: The data set SASUSER.MDM may be incomplete.  When this step was stopped there were 431
         observations and 8 variables.
WARNING: Data set SASUSER.MDM was not replaced because this step was stopped.
NOTE: DATA statement used (Total process time):
      real time           0.38 seconds
      cpu time            0.29 seconds```

我不明白为什么input 似乎不起作用。日期仍列为列属性下的字符串。 do 部分也没有按预期工作。如有任何进一步的指导,我将不胜感激。

【问题讨论】:

  • 我不是 SAS 专家,但也许您应该尝试将日期格式化为 format startdate ddmmyy10.;format stopdate ddmmyy10.;
  • 您在 SAS 日志中构建问题的照片时做得很糟糕。您似乎已在图像中切掉了头部。 日志中第 80 行的代码行是什么? 请以文字而非照片的形式发布文本。发布示例输入数据以及您希望从该数据中获得的输出。
  • start_date = input(startDate, yymmdd10.); 将您的字符日期转换为数字。你也可以内联。 do date = input(startdate, yymmdd10.) to input(stopDate, yymmdd10.);;
  • 并且数据步骤在这些类型的计算中比 SQL 更好。
  • 去掉PUT,你只需要改变我指出的那一行。

标签: sas


【解决方案1】:
  1. 不要在 DATA 和 SET 语句中使用相同的名称。然后你总是不得不从头开始重建。
  2. 将您的开始日期和结束日期转换为 SAS 日期
  3. 删除 PUT
  4. 添加格式以根据需要显示它们
  5. 删除旧变量以避免混淆。

您的两个代码步骤,数据步骤和 SQL 似乎不相关。不知道为什么您甚至需要间隔或任何日期的列表。有更好的方法来计算重叠。我认为您通过xy problem 向我们展示了您正在尝试做的事情会容易得多,人们将能够提供更好的解决方案。

  data sasuser.Mdm2; /*1*/
   set sasuser.Mdm; 
    /*2*/
   start_date = input(startdate, yymmdd10.);
   end_date = input(stopdate, yymmdd10.);

    do xdate = start_date to stop_date;
       output; /*3*/
     end;

    /*4*/
     format start_date end_date xDate yymmdd10.;
     /*5*/
    drop startdate stopdate;

    run;

     *check;
      proc contents data=sasuser.mdm2;
      run;

编辑:另外,如果您有某种分组变量来表明这些是同一剧集的一部分,那么您可以只取日期的最小值/最大值并减去它们以获得初学者的间隔持续时间。通过数据步骤进行分组很简单。

  data want;
  set have;
 by id;
 
 retain episode;
 
 start_date = input(start_date, yymmdd10.);
 end_date = input(stopdate, yymmdd10.);
 prev_stop_date = lag(stopDate);

 if first.id then do;
      episode = 0;
      call missing(prev_stop_date);
 end;

 if not (start_date <=prev_stop_date <= end_date) then episode+1;

 *could add in logic to calculate dates and durations as well depending....;

 run;

【讨论】:

  • 如果他们在初始数据集中有多条记录,那么这可能是进行“多少天”计算的最简单方法;当然有更快的方法,但我不会责怪一个相对新手程序员走这条路,因为它的风险相当低。
  • 是的,但是一旦您的数据集变大,就会爆炸。我在查看药物剂量的东西时使用了这种方法,它有效但根本无法扩展。
  • 这真的很清楚,谢谢。对于未来的问题,我会牢记“xy 问题”——我的主要目标是找到持续时间,同时对许多患者的重叠日期进行折扣。我使用的方法基于我在support.sas.com 站点中找到的内容,但我始终愿意接受更好的解决方案。关于分组变量,我确实有一个“OBS”列,对每个药物使用实例进行编号。我还有一个“KEY”列,它将 OBS 附加到主题 ID (SUBJID)。将来我可能不得不对更大的数据集再次执行此操作。在这种情况下你会推荐什么?
【解决方案2】:

听起来您的 SAS 日志在抱怨此声明。

do xdate=startdate to stopdate;

因为 STARTDATE 和 STOPDATE 是字符串而不是日期。

确保将日期值创建为日期而不是字符串。

【讨论】:

    【解决方案3】:

    Tom 是对的,当然,startdatestopdate 似乎是字符。

    要正确使用它,请执行以下操作(只有 do 循环与您相关,其余的就是显示它工作):

    data _null_;
      startdate = '2017-03-02';
      stopdate  = '2017-03-16';
      do xdate = input(Startdate,yymmdd10.) to input(stopdate,yymmdd10.);
        put xdate= yymmdd10.; *just put to the log to see what you are getting;
      end;
    run;
    

    input 会将文本转换为数值。请注意,如果您希望能够查看 xdate,则必须将其格式化为日期格式 - 但是,如果您只是将其用作输入,则可以关闭格式。

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多