楼主: zwnSAS121
1184 0

[程序分享] 解决实际问题之填补确实月份末日数据 [推广有奖]

  • 6关注
  • 2粉丝

博士生

19%

还不是VIP/贵宾

-

威望
0
论坛币
294 个
通用积分
2.0010
学术水平
13 点
热心指数
16 点
信用等级
13 点
经验
2473 点
帖子
112
精华
0
在线时间
330 小时
注册时间
2015-12-18
最后登录
2020-8-29

楼主
zwnSAS121 发表于 2017-1-15 13:11:05 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
  1. data actual;
  2. informat ytime yymmdd10. stime yymmdd10.;
  3. input ytime stime yvalue svalue;
  4. format ytime yymmdd10.  stime yymmdd10.;
  5. month=month(stime);
  6. cards;
  7. 2016-01-28         2016-05-13          10000        1000
  8. 2016-01-28         2016-06-21          9000        1000
  9. 2016-01-28         2016-08-03          8000        5000
  10. 2016-01-28         2016-08-20          3000        3000
  11. ;

  12. /*生成一月份的末日*/
  13. data first_mori;
  14. informat ytime yymmdd10. etime yymmdd10.;
  15. input ytime etime;
  16. format ytime yymmdd10.  etime yymmdd10.;
  17. cards;
  18. 2016-01-28         2016-01-31
  19. ;
  20. run;

  21. /*利用数组生成二月到十月的末日*/
  22. data mori(keep=ytime etime);
  23. ytime='28jan2016'd;
  24. ytime1='2016-01-28';/*假如提供的是字符型日期*/
  25. mori0=intnx('month',input(ytime1, anydtdte.),0,'e');
  26. array mori(*) mori1-mori11;
  27. do i=1 to dim(mori);/*数组下标不能从0开始*/
  28. mori(i)=intnx('month',input(ytime1, anydtdte.),i,'e');/*间隔i个月最后一天*/
  29. etime=mori(i);
  30. format ytime mori0 mori1-mori11 etime yymmdd10.;
  31. output;
  32. end;
  33. run;

  34. /*生成所有月份末日*/
  35. data allmori;
  36. set first_mori mori;
  37. month=month(etime);
  38. run;

  39. /*生成需要填补的每月末日*/
  40. proc sql;
  41. create table supplement as
  42. select ytime,etime
  43. from allmori where not exists
  44. (select *
  45. from actual
  46. where allmori.month=
  47. actual.month);
  48. run;

  49. /*月份相同的交集查询*/
  50. proc sql;
  51. create table month_intersect as
  52. select *
  53. from actual as a,
  54. allmori as b
  55. where a.month=b.month;
  56. quit;

  57. /*重命名为了后面的合并变量*/
  58. data supplement_1;
  59. set supplement(rename=(etime=stime));
  60. svalue=0;
  61. run;

  62. /*set语句纵向拼接数据集*/
  63. data youneed(drop=month);
  64. set actual supplement_1;
  65. run;
  66. proc sort data=youneed;by descending stime;run;

  67. /*retain函数复制上一条观测值,因为是之前是降序排序,相当于取下一条观测*/
  68. data youneed1(drop=yvalue);
  69. retain ytime stime yvalue1 svalue;
  70. set youneed;
  71. if yvalue^=. then yvalue1=yvalue;
  72. run;

  73. /*重命名换原你的变量名*/
  74. data youneed1;
  75. set youneed1(rename=(yvalue=yvalue1));
  76. run;
  77. /*最后升序排序一下,大功告成*/
  78. proc sort data=youneed1;by stime;run;
复制代码


二维码

扫码加我 拉你入群

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

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

关键词:实际问题 日数据 Supplement intersect informat actual 9000

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-3 19:12