楼主: Undernatural
1902 8

[实际应用] SAS 日期宏变量 宏 [推广有奖]

  • 1关注
  • 0粉丝

本科生

76%

还不是VIP/贵宾

-

威望
0
论坛币
256 个
通用积分
2.8669
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
422 点
帖子
36
精华
0
在线时间
161 小时
注册时间
2019-7-10
最后登录
2024-4-19

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
将生成的日期生成为宏变量,再将日期宏变量插入数据集,但是插入日期失败,
  1. option spool;
  2. %macro a;
  3. data _null_;
  4.         call symput('mon',intck("month",'01dec2020'd,(today())));
  5. run;
  6. data sub_obs_mon;
  7.         do i=1 to &mon.;
  8.                 today=today();
  9.                 obs_dt=intnx('month','01dec2020'd,i,"end");
  10.                 format obs_dt today yymmdd10.;
  11.                 y=year(obs_dt);
  12.                 m=month(obs_dt);
  13.                 d=day(obs_dt);
  14.                 output;
  15.         end;
  16.         keep obs_dt y m d;
  17. run;
  18. data _null_;
  19.         set sub_obs_mon nobs=n;
  20.         call symput('n',n);
  21.         call symput('dt_'||left(_n_),compress(obs_dt));
  22.         call symput('y_'||left(_n_),compress(y));
  23.         call symput('m_'||left(_n_),compress(m));
  24.         call symput('d_'||left(_n_),compress(d));
  25. run;
  26. %do i=1 %to &n.;
  27.         %local tjyf_&i. dt_&i  y_&i. m_&i. d_&i.;
  28.         %let obs_dt=%sysfunc(mdy(%sysfunc(inputn(&&m_&i,best12.)),%sysfunc(inputn(&&d_&i,best12.)),%sysfunc(inputn(&&y_&i,best12.))));
  29. %end;
  30. %do i=1 %to &n.;
  31.         data a_&i.;
  32.                 date=&obs_dt;
  33.                 dt=%sysfunc(inputn(&&dt_&i,yymmdd10.));
  34.                 format date dt yymmdd10.;
  35.         run;
  36. %end;
  37. %mend;
  38. %a;
复制代码
生成的a_1,a_2里的date、dt都为空值,调试了好久都无法实现,不知道错在哪里,请大神指教一下!!着急!!!!
1612491952(1).jpg
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:compress sysfunc symput format Option

  1. option spool mprint ;
  2. options symbolgen;
  3. %macro a;
  4. data _null_;
  5.         call symput('mon',intck("month",'01dec2020'd,(today())));
  6. run;
  7. data sub_obs_mon;
  8.         do i=1 to &mon.;
  9.                 today=today();
  10.                 obs_dt=intnx('month','01dec2020'd,i,"end");
  11.                 format obs_dt today yymmdd10.;
  12.                 y=year(obs_dt);
  13.                 m=month(obs_dt);
  14.                 d=day(obs_dt);
  15.                 output;
  16.         end;
  17.         keep obs_dt y m d;
  18. run;
  19. data _null_;
  20.         set sub_obs_mon nobs=n;
  21.         call symput('n',n);
  22.         call symput('dt_'||left(_n_),compress(obs_dt));
  23.         call symput('y_'||left(_n_),compress(y));
  24.         call symput('m_'||left(_n_),compress(m));
  25.         call symput('d_'||left(_n_),compress(d));
  26. run;


  27. %do i=1 %to &n.;
  28.         %*local tjyf_&i. dt_&i  y_&i. m_&i. d_&i.;
  29.         %let obs_dt=%sysfunc(catx(-,&&y_&i.,&&m_&i.,&&d_&i.));
  30. %end;
  31. %do i=1 %to &n.;
  32.         data a_&i.;
  33.                 date=input("&obs_dt",anydtdte20.);
  34.                 format date yymmdd10.;
  35.         run;
  36. %end;
  37. %mend;
  38. %a;
复制代码


不太清楚你这个循环的意义,不过您既然这么写了,我就这么将就着改吧。显然这个需求有更好的实现思路

使用道具

藤椅
Undernatural 发表于 2021-2-5 13:12:21 |只看作者 |坛友微信交流群
孤单的我们 发表于 2021-2-5 11:22
不太清楚你这个循环的意义,不过您既然这么写了,我就这么将就着改吧。显然这个需求有更好的实现思路
我这个循环是要把sub_obs_mon里的每一个obs_dt日期值取出来,插入后面的数据集循环使用;
我的疑惑是赋值的时间宏变量,插入循环中的数据集总是失败,不能继续时与其他时间值进行计算;
你修改后的宏我运行之后还是报错,生成的a_1,a_2d里的时间还是空值
[img][/img]

使用道具

板凳
Undernatural 发表于 2021-2-5 13:19:25 |只看作者 |坛友微信交流群
孤单的我们 发表于 2021-2-5 11:22
不太清楚你这个循环的意义,不过您既然这么写了,我就这么将就着改吧。显然这个需求有更好的实现思路
我的需求就是将sub_obs_mon里的每一个obs_dt取出作为宏变量,在插入到循环当中,与其他时间值进行计算,我的代码存在问题,插入的时间obs_dt都是空置;
你的代码我执行后,生成的a_1,a_2里的obs_dt也是空值,问题出在哪里呢?一时也想不明白?
提示如下图:

1612501818(1).jpg 1612501837(1).jpg

使用道具

报纸
Undernatural 发表于 2021-2-5 13:20:25 |只看作者 |坛友微信交流群
[img]C:\Users\dell\Desktop\1612501837(1).jpg
[/img]

使用道具

地板
Undernatural 发表于 2021-2-5 13:34:46 |只看作者 |坛友微信交流群
Undernatural 发表于 2021-2-5 13:12
我这个循环是要把sub_obs_mon里的每一个obs_dt日期值取出来,插入后面的数据集循环使用;
我的疑惑是赋值 ...
日志如下:

1612501818(1).jpg
1612501837(1).jpg

使用道具

7
Undernatural 发表于 2021-2-5 17:39:47 |只看作者 |坛友微信交流群
孤单的我们 发表于 2021-2-5 11:22
不太清楚你这个循环的意义,不过您既然这么写了,我就这么将就着改吧。显然这个需求有更好的实现思路
我更改了一下,执行之后没有问题
  1. option spool mprint ;
  2. options symbolgen;
  3. %macro a;
  4. data _null_;
  5.         call symput('mon',intck("month",'01dec2020'd,(today())));
  6. run;
  7. data sub_obs_mon;
  8.         do i=1 to &mon.;
  9.         today=today();
  10.         obs_dt=intnx('month','01dec2020'd,i,"end");
  11.         output;
  12.         end;
  13. run;
  14. proc sql noprint;
  15.         select count(*) into : n from sub_obs_mon;
  16.         %do i=1 %to &n.;
  17.                 %local dt_&i;
  18.                 select obs_dt into : dt_&i from sub_obs_mon where i=&i;
  19.         %end;
  20. quit;
  21. %do i=1 %to &n.;
  22.         data a_&i.;
  23.                 date=&&dt_&i;
  24.                 format date yymmdd10.;
  25.         run;
  26. %end;
  27. %mend;
  28. %a;
复制代码

使用道具

8
孤单的我们 发表于 2021-2-7 09:30:37 |只看作者 |坛友微信交流群
Undernatural 发表于 2021-2-5 17:39
我更改了一下,执行之后没有问题
完全不必循环,不过既然你已达到你的目的就不说什么了

使用道具

9
Undernatural 发表于 2021-2-8 13:40:33 |只看作者 |坛友微信交流群
孤单的我们 发表于 2021-2-7 09:30
完全不必循环,不过既然你已达到你的目的就不说什么了
目前我只想到这种方式,不过还是感谢!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 08:51