楼主: caibirdcnb
3032 5

[原创博文] 请问高手如何根据日期循环? 谢谢了! [推广有奖]

  • 0关注
  • 36粉丝

讲师

47%

还不是VIP/贵宾

-

威望
0
论坛币
1367 个
通用积分
16.5538
学术水平
67 点
热心指数
70 点
信用等级
64 点
经验
6762 点
帖子
206
精华
2
在线时间
433 小时
注册时间
2011-8-31
最后登录
2023-9-23

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请问各位高手应该如何实现下面的功能,非常感谢!

有N个SAS数据名称为data_20110101,data_ 20110102,......data_ 20120318,data_ 20120319,文件名的数字是年月日。
希望实现的功能是通过指定X = xx来确定要扫描(提取,合并等等)哪些日期的文件。xx是天数,例如X = 180表示扫描从180天前到今天的所有文件。
另外,如果是扫描一段时间,例如sDate = 20110406,eDate = 20120123,又应该如何实现呢?

请各位高手指导,非常感谢!
二维码

扫码加我 拉你入群

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

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

关键词:Data date 如何实现 非常感谢 ATE 年月日 如何

沙发
playmore 发表于 2012-3-20 13:34:54 |只看作者 |坛友微信交流群
在data步外加%do循环
然后把这些全部放到一个macro中完成
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

使用道具

藤椅
caibirdcnb 发表于 2012-3-20 19:06:00 |只看作者 |坛友微信交流群
谢谢楼上,我的问题是下面语句当从20111231到20120101的时候,要循环上万次。
%do i = &startdate %to &enddate;

使用道具

板凳
小春1988 发表于 2012-4-1 14:21:24 |只看作者 |坛友微信交流群
一个比较笨的方法,先在data步里面将要循环的data求出来,到导出成为txt文件,然后安文本格式重新读入,处理一下“-”这个字符,然后运用宏进行实现

使用道具

报纸
可~乐 发表于 2012-4-7 23:09:56 |只看作者 |坛友微信交流群
嘿嘿,最近刚好有个任务也在做这个事情。。。可以参考一下。。。
  1. %macro test(date_begin,date_end);

  2. /*取开始时间date_begin的年,月,日*/
  3. %let y_bgn=%sysfunc(year(&date_begin));
  4. %let m_bgn=%sysfunc(month(&date_begin));
  5. %let d_bgn=%sysfunc(day(&date_begin));

  6. /*将开始时间date_begin转化为天数的形式,天数的形式是为了循环*/
  7. %let dt_bgn=%sysfunc(mdy(&m_bgn,&d_bgn,&y_bgn));

  8. %put &dt_bgn;
  9. %put &date8_bgn;

  10. /*取结束时间date_end的年,月,日*/
  11. %let y_end=%sysfunc(year(&date_end));
  12. %let m_end=%sysfunc(month(&date_end));
  13. %let d_end=%sysfunc(day(&date_end));

  14. /*将结束时间date_end转化为天数的形式,天数的形式是为了循环*/
  15. %let dt_end=%sysfunc(mdy(&m_end,&d_end,&y_end));

  16. %put &dt_end;
  17. %put &date8_end;

  18. %let string=;

  19. %do i=&dt_bgn %to &dt_end;

  20.         %let y=%sysfunc(year(&i));
  21.         %let m=%sysfunc(month(&i));
  22.         %let d=%sysfunc(day(&i));

  23. /*八位数的形式是为了提取数据集*/
  24.         %let date8=%eval(&y*10000+&m*100+&d);

  25. /*将这些数据集名字连接到一起*/
  26.         %let string=&string||data_&date8;

  27. %end;

  28. %put &string;

  29. /*将||转化为空格*/
  30. %let stringz=%sysfunc(tranwrd(&string,||, ));

  31. %put &stringz;
  32. %mend;

  33. %test('8dec2011'd,'10jan2012'd);
复制代码

使用道具

地板
caibirdcnb 发表于 2012-4-8 11:44:18 |只看作者 |坛友微信交流群
谢谢楼上,我自己弄了一个简单版的。
  1. data _null_;
  2.         edate='17mar2012'd;
  3.         days=5;
  4.         sdate=edate-days;
  5.         do i=0 to days;
  6.                 y=put(year(edate-i),$4.);
  7.                 if month(edate-i)<10 then m='0'||put(month(edate-i),$1.);else m=put(month(edate-i),$2.);
  8.                 if day(edate-i)<10 then d='0'||put(day(edate-i),$1.);else d=put(day(edate-i),$2.);
  9.                 if week(edate+1-i*7)<10 then w='0'||put(week(edate+1-i*7),$1.);
  10.                 else w=put(week(edate+1-i*7),$2.);
  11.                 call symput('date'||strip(i),y||m||d);
  12.                 call symput('wk'||strip(i),y||w);
  13.         end;
  14. run;
复制代码

使用道具

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

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

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

GMT+8, 2024-5-2 08:47