楼主: yuanyang0927
3448 17

如何用日期do loop来简化程序? [推广有奖]

  • 1关注
  • 0粉丝

初中生

38%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
120 点
帖子
12
精华
0
在线时间
14 小时
注册时间
2015-3-10
最后登录
2016-1-25

楼主
yuanyang0927 发表于 2015-3-10 15:10:59 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
各位高手,

        我的原始数据里包含很多天的信息,我写了一个macro用来把每一天的数据拿出来进行计算:
        %let inputdata=original;
        %macro Cal (inputdate=,date=);                                                                                                         
         data split_&date;                                                                                                                        
         set &inputdata;                                                                                                                     
         if date=&inputdate then output split_&date;                                                                                             
run;  
%mend;

%Cal (inputdate='10Jun2010'd,date=10Jun2010);                                                                                          
%Cal (inputdate='11Jun2010'd,date=11Jun2010);                                                                                          
%Cal (inputdate='12Jun2010'd,date=12Jun2010);                                                                                          
%Cal (inputdate='13Jun2010'd,date=13Jun2010);                                                                                          
%Cal (inputdate='14Jun2010'd,date=14Jun2010);                                                                                          
%Cal (inputdate='15Jun2010'd,date=15Jun2010);                                                                                          
%Cal (inputdate='16Jun2010'd,date=16Jun2010);                                                                                          
.......
%Cal (inputdate='15Apr2014'd,date=15Apr2014);     

但是由于有几年的数据,如果用以上方式调用macro需要把几年当中的每一天都列出来。我想用一个do loop来实现这一步,比方说用:do i=‘10Jun2010’d to ‘15Apr2014’d。。。。但是不知道怎样可以实现?恳请高手指点一下,谢谢!
二维码

扫码加我 拉你入群

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

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

关键词:loop 如何用 Original output Origin 程序 如何

回帖推荐

pobel 发表于5楼  查看完整内容

data _null_; do dt= '10Jun2010'd to '15Apr2014'd; dtc=put(dt,date9.); code=cats('%Cal(inputdate=',dt,',date=',dtc,')'); call execute(code); end; run;

沙发
jasonmo 发表于 2015-3-10 15:17:57
data有按日期排序嗎?
有的話很好做

藤椅
yuanyang0927 发表于 2015-3-10 15:32:27
jasonmo 发表于 2015-3-10 15:17
data有按日期排序嗎?
有的話很好做
data是按日期排好顺序的,请教高手怎么实现这个啊。。。。多谢!

板凳
yuanyang0927 发表于 2015-3-10 15:43:29
yuanyang0927 发表于 2015-3-10 15:32
data是按日期排好顺序的,请教高手怎么实现这个啊。。。。多谢!
我试了用类似这样的程序:
%macro daily(date_begin,date_end);                                                                                                   
  %let i="&date_begin."d;                                                                                                               
  %let j="&date_end."d;                                                                                                                        %do k= &i %to &j;                                                                                                                     
    %Cal(inputdate=k, date=k);                                                                                                         
  %end;                                                                                                                                 
%mend;                                                                                                                                 
%daily(10jan2010,11jan2010);  
但是log提示
ERROR: 在需要数值操作数的 %EVAL 函数或 %IF 条件中发现字符操作数。条件是: &i
ERROR: %FROM 值(%DO K 循环中)无效。
ERROR: 在需要数值操作数的 %EVAL 函数或 %IF 条件中发现字符操作数。条件是: &j
ERROR: %TO 值(%DO K 循环中)无效。
ERROR: 宏 DAILY 将终止执行。

急死了,请问有什么办法可以解决啊?

报纸
pobel 在职认证  发表于 2015-3-10 20:20:54
data _null_;
   do dt= '10Jun2010'd to '15Apr2014'd;
      dtc=put(dt,date9.);
          code=cats('%Cal(inputdate=',dt,',date=',dtc,')');
          call execute(code);
   end;
run;

地板
yuanyang0927 发表于 2015-3-11 10:08:14
pobel 发表于 2015-3-10 20:20
data _null_;
   do dt= '10Jun2010'd to '15Apr2014'd;
      dtc=put(dt,date9.);
试过,程序可以运行!谢谢牛人,程序非常巧妙而且简练!

有几个关于这行程序的问题:
code=cats('%Cal(inputdate=',dt,',date=',dtc,')');

1) cats函数的用途是否只是将后面的程序变成字符串形式,以备call execute使用?
2) 为什么dt和dtc都要放在单引号里,并且前后加逗号呢?我试了把这些符号去掉,确实这两个变量都不能被resolve了。

非常感谢!

7
pobel 在职认证  发表于 2015-3-11 13:33:44
yuanyang0927 发表于 2015-3-11 10:08
试过,程序可以运行!谢谢牛人,程序非常巧妙而且简练!

有几个关于这行程序的问题:
1, cats函数只是把需要调用宏的代码准备好。
2, dt和dtc并没有放到单引号里,而是分别作为cats函数的参数。逗号是cats的参数分隔符。

8
pobel 在职认证  发表于 2015-3-11 13:33:49
yuanyang0927 发表于 2015-3-11 10:08
试过,程序可以运行!谢谢牛人,程序非常巧妙而且简练!

有几个关于这行程序的问题:
1, cats函数只是把需要调用宏的代码准备好。
2, dt和dtc并没有放到单引号里,而是分别作为cats函数的参数。逗号是cats的参数分隔符。

9
pobel 在职认证  发表于 2015-3-11 13:37:03
yuanyang0927 发表于 2015-3-11 10:08
试过,程序可以运行!谢谢牛人,程序非常巧妙而且简练!

有几个关于这行程序的问题:
1,cats函数是用来生成宏调用语句;
2. dt和dtc并不是在单引号里。

10
yuanyang0927 发表于 2015-3-11 14:59:47
pobel 发表于 2015-3-11 13:33
1, cats函数只是把需要调用宏的代码准备好。
2, dt和dtc并没有放到单引号里,而是分别作为cats函数的参数 ...
学习了!以前只知道cats函数连接字符串。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 04:04