【问题标题】:SAS loop through month-ends in rangeSAS 循环遍历范围内的月末
【发布时间】:2021-09-14 13:04:49
【问题描述】:

假设我有一个库save,其中包含每日文件thefile_dly_yyyymmdd

例如save.thefile_dly_20150831, save.thefile_dly_20150901, ... , save.thefile_dly_20210731.

我想对该库中的历史数据进行一些操作,但是,我只想提取特定日期之间的文件,并且只想保留与每个月的最后一个文件对应的文件,例如我要提取save.thefile_dly_20150831save.thefile_dly_20150930save.thefile_dly_20151031

类似于以下内容。

%macro loop_through(start,end);
 %do i = &start. %to &end.;
    %if %sysunc(exist(SAVE.THEFILE_DLY_&i.)) %then %do;
      /* Do some data processing on the file */
    %end;
 %end;
%mend;

%loop_though(20150831,20210731);

问题在于上述代码将遍历 20150831 和 20210731 之间的每个整数,这不是最优的,而且它会处理该月存在的每个文件,而不仅仅是与最后一个对应的文件每个月的一天。

如何调整?任何建议将不胜感激。

【问题讨论】:

  • 您可以在库 SAVE 中列出数据集名称。

标签: sas do-loops


【解决方案1】:

要循环遍历日历间隔,请遍历间隔数。使用 INTNX() 函数计算下一个间隔的日期。使用 INTCK() 函数计算请求的间隔数。

%macro loop_through(start,end);
  %local offset ymd dsname ;
  %do offset = 0 %to %sysfunc(intck(month,&start,&end));
     %let ymd=%sysfunc(intnx(month,&start,&offset,end),yymmddn8.);
     %let dsname=SAVE.THEFILE_DLY_&ymd;
     %if %sysunc(exist(&dsname)) %then %do;
       /* Do some data processing on the file */
     %end;
  %end;
%mend;

%loop_though('01AUG2015'd,'01JUL2021'd);

如果您确实希望允许宏的用户传入 YYYYMMDD 数字字符串而不是实际的 SAS 日期值,那么请在宏中添加一些逻辑以将数字字符串转换为实际的日期值。例如:

%let start=%sysfunc(inputn(&start,yymmdd8.));

【讨论】:

    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 2021-12-30
    • 2018-05-11
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多