楼主: Wo_si_鍕
2206 8

填补缺失的月份数据 [推广有奖]

  • 0关注
  • 1粉丝

大专生

53%

还不是VIP/贵宾

-

威望
0
论坛币
789 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
741 点
帖子
33
精华
0
在线时间
36 小时
注册时间
2014-11-3
最后登录
2018-9-18

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

各位大大求助:原数据:
应还时间 实还时间 应还金额 实还金额
2016.01.28 2016.05.13 10000 1000
2016.01.28 2016.06.21 9000 1000
2016.01.28 2016.08.03 8000 5000
2016.01.28 2016.08.20 3000 3000

1,2,3,4,7月份都没有还款,怎么把缺失的补上应还日期,实还日期,实还金额变成0,希望的效果如红色部分:

应还时间 实还时间应还金额 实还金额
2016.01.28 2016.01.31 10000 0
2016.01.28 2016.02.29 10000 0
2016.01.28 2016.03.31 10000 0
2016.01.28 2016.04.30 10000 0
2016.01.28 2016.05.13 10000 1000
2016.01.28 2016.06.21 9000 1000
2016.01.28 2016.07.31 8000 0
2016.01.28 2016.08.03 8000 5000
2016.01.28 2016.08.20 3000 3000


希望各位大大帮助,万分感谢


二维码

扫码加我 拉你入群

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

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

关键词:万分感谢 红色部分 9000

回帖推荐

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

沙发
zwnSAS121 发表于 2017-1-7 09:45:00 |只看作者 |坛友微信交流群
  1. data a;
  2. informat ytime yymmdd10. stime yymmdd10.;
  3. input ytime stime yvalue svalue;
  4. format ytime yymmdd10.  stime yymmdd10.;
  5. cards;
  6. 2016-01-28         2016-05-13          10000        1000
  7. 2016-01-28         2016-06-21          9000        1000
  8. 2016-01-28         2016-08-03          8000        5000
  9. 2016-01-28         2016-08-20          3000        3000
  10. ;
  11. data b;
  12. informat ytime yymmdd10. stime yymmdd10.;
  13. input ytime stime yvalue svalue;
  14. format ytime yymmdd10. stime yymmdd10.;
  15. cards;
  16. 2016-01-28        2016-01-31        10000        0
  17. 2016-01-28        2016-02-29        10000        0
  18. 2016-01-28        2016-03-31        10000        0
  19. 2016-01-28        2016-04-30        10000        0
  20. 2016-01-28        2016-07-31        8000        0
  21. ;

  22. data a;
  23. modify a b;
  24. by stime;
  25. if _iorc_=0 then replace;
  26. else do;
  27. _error_=0;
  28. _iorc_=0;
  29. output;
  30. end;
  31. run;
  32. /*为了达到你的效果,再排序一下*/
  33. proc sort data=a;by stime;run;
复制代码

360截图20170107094324850.jpg (20.72 KB)

360截图20170107094324850.jpg

已有 1 人评分经验 收起 理由
李会超 + 100 精彩帖子

总评分: 经验 + 100   查看全部评分

使用道具

藤椅
zwnSAS121 发表于 2017-1-7 09:46:35 |只看作者 |坛友微信交流群
  1. data a;
  2. informat ytime yymmdd10. stime yymmdd10.;
  3. input ytime stime yvalue svalue;
  4. format ytime yymmdd10.  stime yymmdd10.;
  5. cards;
  6. 2016-01-28         2016-05-13          10000        1000
  7. 2016-01-28         2016-06-21          9000        1000
  8. 2016-01-28         2016-08-03          8000        5000
  9. 2016-01-28         2016-08-20          3000        3000
  10. ;
  11. data b;
  12. informat ytime yymmdd10. stime yymmdd10.;
  13. input ytime stime yvalue svalue;
  14. format ytime yymmdd10. stime yymmdd10.;
  15. cards;
  16. 2016-01-28        2016-01-31        10000        0
  17. 2016-01-28        2016-02-29        10000        0
  18. 2016-01-28        2016-03-31        10000        0
  19. 2016-01-28        2016-04-30        10000        0
  20. 2016-01-28        2016-07-31        8000        0
  21. ;

  22. data a;
  23. modify a b;
  24. by stime;
  25. if _iorc_=0 then replace;
  26. else do;
  27. _error_=0;
  28. _iorc_=0;
  29. output;
  30. end;
  31. run;
  32. /*为了达到你的效果,再排序一下*/
  33. proc sort data=a;by stime;run;
复制代码

使用道具

板凳
Wo_si_鍕 发表于 2017-1-9 11:00:56 |只看作者 |坛友微信交流群
你好,意思不对,实还时间:1,2,3,4,7这几个月份是没有数据的,我希望是代码自动生成:应还时间取本身的应还时间,实还时间取缺失月份的最后一天,应还金额取下一月有的金额,实还金额取0;也就是说红色部分是不存在的,是造出来的数据

使用道具

报纸
zwnSAS121 发表于 2017-1-9 16:47:46 |只看作者 |坛友微信交流群
  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. data supplement_1;
  51. set supplement(rename=(etime=stime));
  52. svalue=0;
  53. run;

  54. /*set语句纵向拼接数据集*/
  55. data youneed(drop=month);
  56. set actual supplement_1;
  57. run;
  58. proc sort data=youneed;by descending stime;run;

  59. /*retain函数复制上一条观测值,因为是之前是降序排序,相当于取下一条观测*/
  60. data youneed1(drop=yvalue);
  61. retain ytime stime yvalue1 svalue;
  62. set youneed;
  63. if yvalue^=. then yvalue1=yvalue;
  64. run;

  65. /*重命名换原你的变量名*/
  66. data youneed1;
  67. set youneed1(rename=(yvalue=yvalue1));
  68. run;
  69. /*最后升序排序一下,大功告成*/
  70. proc sort data=youneed1;by stime;run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Wo_si_鍕 + 1 + 1 + 1 非常感谢!

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

地板
Wo_si_鍕 发表于 2017-1-9 16:54:59 |只看作者 |坛友微信交流群
zwnSAS121 发表于 2017-1-9 16:47
感谢大神帮忙!

使用道具

7
scarlettzouyu 发表于 2017-1-9 18:16:14 |只看作者 |坛友微信交流群
data a;
informat repay_time yymmdd10. repayed_time yymmdd10.;
input repay_time repayed_time repay_money  repeyed_money;
format repay_time yymmdd10.  repayed_time yymmdd10.;

cards;
2016-01-28         2016-05-13          10000        1000
2016-01-28         2016-06-21          9000        1000
2016-01-28         2016-08-03          8000        5000
2016-01-28         2016-08-20          3000        3000
2016-02-16         2016-02-23                   5000                   3000
2016-02-16                   2016-03-25          5000        500
2016-02-16         2016-06-30          5000                   100
2016-03-03         2016-03-03          8000        1000
2016-03-03         2016-05-13          8000        1000
2016-03-03         2016-07-03          8000        1000
2016-03-03         2016-09-03          8000        500
2016-04-03         2016-07-30          12000       1000
2018-04-25                   2018-07-25          10000            2000
;
data  a1;
set a;
do i=0 to 25;
end_of_month= intnx('month',repay_time, i,'e');
format end_of_month yymmdd10.;
if repay_time<end_of_month<repayed_time then  output;
end;
run;

使用道具

8
zwnSAS121 发表于 2017-1-9 19:18:37 |只看作者 |坛友微信交流群
scarlettzouyu 发表于 2017-1-9 18:16
data a;
informat repay_time yymmdd10. repayed_time yymmdd10.;
input repay_time repayed_time repay_ ...
程序是比较简洁,但是不是客户的需求啊

使用道具

9
zwnSAS121 发表于 2017-1-9 19:42:56 |只看作者 |坛友微信交流群
zwnSAS121 发表于 2017-1-9 19:18
程序是比较简洁,但是不是客户的需求啊
你这程序目的是满足什么需求?

使用道具

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

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

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

GMT+8, 2024-4-19 21:50