楼主: 040108020007
4526 4

[原创博文] 求助一个sas时间格式的问题 [推广有奖]

  • 0关注
  • 0粉丝

已卖:1份资源

讲师

12%

还不是VIP/贵宾

-

威望
0
论坛币
3437 个
通用积分
2.2500
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
7488 点
帖子
210
精华
0
在线时间
603 小时
注册时间
2007-6-25
最后登录
2025-12-12

楼主
040108020007 发表于 2010-10-13 14:43:25 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
data a;
input sb $11. p $9. startdate yymmdd10. enddate yymmdd10.@;
cards;
13404800000 47117001 20060401 20070401
13404800007 40017100 20060501 20080401
13404800012 47104049 20061219 20080301
13404800014 47104049 20061208 20070801
13404800016 40013004 20061230 20070501
13404800020 47104049 20060630 20070901
;
run;

第一个问题是当我用@@而不是@的时候,输出的结果如下,而用一个@,结果就是对的6个观测,这是为什么?
Obsserialnumberprod_idstartdateenddate1134048000004711700116892172572  ..3134048000074001710016922176234  ..5134048000124710404917154175926  ..7134048000144710404917143173798  ..91340480001640013004171651728710  ..111340480002047104049169821741012  ..

第二个问题是,这里我用了时间格式,但显然输出的不是我想要的结果,我想20070401作为一个时间来处理,怎么实现?
二维码

扫码加我 拉你入群

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

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

关键词:serial Number Start Input cards

回帖推荐

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

建议用Formatted Input 的时候加上 ":" modifier, 这样就不会受到@或@@的影响。 data a; input sb : $11. p : $9. startdate : yymmdd10. enddate : yymmdd10.@; cards; 13404800000 47117001 20060401 20070401 13404800007 40017100 20060501 20080401 13404800012 47104049 20061219 20080301 13404800014 47104049 20061208 20070801 13404800016 40013004 20061230 20070501 13404800020 47104049 20060630 20070 ...

soporaeternus 发表于2楼  查看完整内容

1个人觉得没必要用@,详细可见相关帮助 2 换个输入方式......

本帖被以下文库推荐

沙发
soporaeternus 发表于 2010-10-13 15:11:34
  1. data a;
  2. input sb $11. p $9. startdate:yymmdd8. enddate:yymmdd8.;
  3. format startdate enddate yymmdd10.;

  4. cards;
  5. 13404800000 47117001 20060401 20070401
  6. 13404800007 40017100 20060501 20080401
  7. 13404800012 47104049 20061219 20080301
  8. 13404800014 47104049 20061208 20070801
  9. 13404800016 40013004 20061230 20070501
  10. 13404800020 47104049 20060630 20070901
  11. ;
  12. run;

  13. proc print data=a;run;quit;
复制代码
1个人觉得没必要用@,详细可见相关帮助
2 换个输入方式......
已有 4 人评分学术水平 热心指数 信用等级 收起 理由
pobel + 1 + 1 我很赞同
hopewell + 1 + 1 + 1 我很赞同
040108020007 + 1 + 1 谢谢哈,又遇到你了
peijiamei + 2 + 2 好的意见建议

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

Let them be hard, but never unjust

藤椅
pobel 在职认证  发表于 2010-10-13 16:33:26
建议用Formatted Input 的时候加上 ":" modifier, 这样就不会受到@或@@的影响。

data a;
input sb : $11. p : $9. startdate : yymmdd10. enddate : yymmdd10.@;
cards;
13404800000 47117001 20060401 20070401
13404800007 40017100 20060501 20080401
13404800012 47104049 20061219 20080301
13404800014 47104049 20061208 20070801
13404800016 40013004 20061230 20070501
13404800020 47104049 20060630 20070901
;
run;


当Formatted Input和@@一起用时,就会产生意外的结果:

data b;
input sb $11. p  $9. startdate  yymmdd10. enddate  yymmdd10.@@;
format startdate enddate yymmdd10.;
cards;
13404800000 47117001 20060401 20070401
13404800007 40017100 20060501 20080401
13404800012 47104049 20061219 20080301
13404800014 47104049 20061208 20070801
13404800016 40013004 20061230 20070501
13404800020 47104049 20060630 20070901
;
run;

Log:

821  data b;
822  input sb $11. p  $9. startdate  yymmdd10. enddate  yymmdd10.@@;
823  format startdate enddate yymmdd10.;
824  cards;
NOTE: SAS went to a new line when INPUT statement reached past the end of a line.
NOTE: The data set WORK.B has 12 observations and 4 variables.
NOTE: DATA statement used (Total process time):
      real time           0.02 seconds
      cpu time            0.03 seconds

831  ;
832  run;



又如下面例子:

data c;
    input c $40. @@;
datalines;
1---shorter than 80---end
;


data c1;
    input c $40. @@;
datalines;
1---shorter than 80---end
2---longer than 80----------------------------------------------but shorter than 160---end
3---shorter than 80---end
4---shorter than 80---end
;


Log:

937  data c;
938      input c $40. @@;
939      datalines;
NOTE: SAS went to a new line when INPUT statement reached past the end of a line.
NOTE: The data set WORK.C has 2 observations and 1 variables.
NOTE: DATA statement used (Total process time):
      real time           0.02 seconds
      cpu time            0.03 seconds


941  ;
942  data c1;
943      input c $40. @@;
944      datalines;
NOTE: SAS went to a new line when INPUT statement reached past the end of a line.
NOTE: The data set WORK.C1 has 14 observations and 1 variables.
NOTE: DATA statement used (Total process time):
      real time           0.02 seconds
      cpu time            0.03 seconds

949  ;

初看程序,预计数据集C中会有1条记录,数据集C1中会有5条记录,而结果却不是这样。


个人猜测:当用datalines/cards读取数据时,
    1. SAS会在每一行的数据后加空格(或类似字符)知道80的倍数;
                Data c1; 数据步中,第一行会补到80个字符,第二行会补到160

    2. 下一行数据(补空格后)的长度不会小于上一行数据;
                 Data c1;数据步中,第三行虽然短于80,仍然补到了160个字符。


个人拙见,凭空猜测。查SAS帮助未果,望高手解惑!
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
peijiamei + 2 + 1 好的意见建议
040108020007 + 1 + 1 我很赞同

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

和谐拯救危机

板凳
月之魅 发表于 2013-4-4 00:48:59
soporaeternus 发表于 2010-10-13 15:11
1个人觉得没必要用@,详细可见相关帮助
2 换个输入方式......
高手请教一下,如果是输入的只有年份呢,那数据input后面格式怎么写呢?谢谢啊!

报纸
xlheyi 发表于 2014-4-26 20:27:20
data a;
input a 11. p 9. startdate yymmdd10. enddate yymmdd10.;
datalines;
13404800000 47117001 20060401 20070401
13404800007 40017100 20060501 20080401
13404800012 47104049 20061219 20080301
13404800014 47104049 20061208 20070801
13404800016 40013004 20061230 20070501
13404800020 47104049 20060630 20070901
;
proc print;
format startdate  enddate yymmddp10.;
run;

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

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