python入门问题,关于一个索引的日期案例

qq_40118488 2017-09-05 10:24:28
以下代码是一个索引的案例:
months=['January','February','March','April','May','June','July','August','September','October','November','December']
ending=['st','nd','rd']+17*['th']\+['st','nd','rd']+7*['th']\+['st']
year =raw_input('Year:')
month=raw_input('Month(1-12):')
day =raw-input('Day(1-31):')
month_number=int(month)
day_number=int(day)
month_name=months[month_number-1]
ordinal=day+ending[day_number-1]

print month_name+' '+ordinal+', '+year


有两个问题:1.不明白第二局为什么要那样表达,为什么要用\表示转义嘛,还是其他意思
2.为什么我用解释器输入在第二句最后一个字符会提示字符错误了,是没有\的原因吗?
...全文
1358 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
天亮后说晚安 2018-01-11
  • 打赏
  • 举报
回复
人生最遗憾的 莫过于轻易地放弃了不该放弃的,固执地坚持了不该坚持的
碧水幽幽泉 2017-09-19
  • 打赏
  • 举报
回复
ktruncate用法详解

ktruncate函数:
ktruncate(a,n,m)将数值型变量a从左到右第n位开始截取m位的值。小数点占一位。取到的值按字符串存储。
例如:
date test;
a=122/3;
b=ktruncate(a,2,2);
run;
将得到的a=40.666666667 而b=0.。注意这里b是字符型。

这里对于a只显示12位,而b能取到最多也只有到a的第12位的值。
如:
date test;
a=122/3;
b=ktruncate(a,10,5);
run;
得到的b=667,虽然声明了5位,但是 从a的第十位开始只剩下三位,所以只能取到后三位667

如果a是一个整数,且位数不到12.那么sas会默认在其前面补上相应的空格以达到12位再取值。(假设空格为s)
如:
date test;
a=7;
b=ktruncate(a,2,2);
run;
这里先将a当成sssssssssss7,b是2个空格,即是ss

date test;
a=7;
b=ktruncate(a,2,11);
run;
这里先将a当成sssssssssss7,b是10个空格和最后的7,即是ssssssssss7
碧水幽幽泉 2017-09-19
  • 打赏
  • 举报
回复
data步知识点:
SAS DATA步之全解密: http://bbs.pinggu.org/thread-2767508-1-1.html

1.规定要创建的SAS数据集:
data; /*系统自动规定数据集名data1, data2,…, datan*/
data _data_; /*等价于语句data;*/
Data a; /*创建临时数据集a*/
data ResDat.a; /*创建永久数据集resdat.a*/
data data1 data2; /*创建两个临时数据集data1和data2*/
data _null_; /*特殊名,不创建SAS数据集,用于输出*/ 不产生数据集,
Run;

一般和PUT语句一起用。由PUT输出结果,只输出到LOG窗口,不会产生SAS数据集(可以提高执行效率)。
data _null_;
x=exp(5);
y=log(10);
put x= y=;
run;
有时候清空work数据,也可以调用~
data test;
set _null_
run;

_last_: SAS系统的一个自动变量,取值为最新创建的SAS数据集名。
例如:查看最新创建的SAS数据集
data a;
set _last_;
run;

2.数据集选项举例。
data new (drop=var1); /*去掉数据集new中变量var1*/
data new (keep=_numeric_); /*保留数据集new中所有数值变量*/
data new (label=’股本变动历史’); /*规定数据集new标签名为”股本变动历史”*/
data new (rename=(var1=u var2=v)); /*将数据集new中变量var1和var2更名为u和v*/
data book(index=(author subject)); /*数据集book对变量author subject建立索引*/

3.一个DATA语句下多个数据集名:
3.1.根据条件产生2个观测子集,名字分别为女同学信息数据集FemaleSt和男同学信息数据集MaleSt。
data FemaleSt MaleSt ;
set ResDat.class;
if sex='F' then output FemaleSt ;
else output MaleSt ;
run;

3.2.根据条件产生2个变量子集,名子分别为height, weight, 每个数据集由KEEP语句保留两个变量。
data height(keep=name height) weight (keep=name weight);
set ResDat.class;
run;

4.数据行引导语句CARDS与CARDS4
数据行之前用CARDS语句或DATALINES语句,告诉SAS系统下面跟着的是数据行。
语句格式:CARDS;或DATALINES;

数据行中含有分号时,必须用CARDS4或DATALINES4语句。
语句格式:Cards4; 或DATALINES4;

5. put _all_: 输出所有变量的值
data;
put "after compile before execution:" _all_;
x = "GOOD";
y = "MORNING";
z = "COLUMBUS";
n = 4;
k = n*2;
put "at end of execution:" _all_;
run;

PUT _PAGE_: 把指针移到新的一页的第一行 ;
PUT OVERPRINT : 把当前输出内容输出到前一个输出行中 
例如要在标题"TITLE OF PAGE"下面加一横线, 其语句是: put 'TITLE OF PAGE' overprint '_____________';

6.自动变量;包括_N_,_ERROR_,END=,IN=,FIRST,LAST,POINT=
_N_ 对DATA步开始执行后的迭代次数进行计数(随着DATA语句的每次迭代,变量_N_自动加1)
_ERROR_ 表示在数据步执行期间有错误发生。_ERROR_的默认值为0,表示程序没有错误。当程序中出现一个或多个错误时,_ERROR_的值变为1。
IN=变量 表示一个特定数据集是否贡献了当前观察值。程序员可以用该选项指定一个变量名,当观测在数据集中时变量值为1否则为0。
END=变量名 END=是SET语句的一个选项表示已经达到输入数据集的结尾。
如果达到文件的结尾,程序员通过指定一个变量名,当数据达到最后一个时,该变量被赋值1,否则为0。
一个SET语句只能设一个END=选项。如果SET语句后有多个数据集,只有达到最后一个数据集的最后一条观测值时,该变量的值才为1。

FIRST first.variable指的是按照variable排序后的每一组variable中的第一个variable,例如按照id排序,那么first.id就是排序后每一组id的第一个id。
LAST last同理,为每一组id的最后一个id

SAS系统对每个BY组创建两个自动变量:First.variable 和 Last.variable, 用来标识每个BY组的第一个和最后一个观测。
对于一个BY组的第一个观测值,First.variable取1,其余取0.
对于一个BY组的最后一个观测值,Last.variable取1,其余取0.


7.SAS之PDV最全解析: Program Data Vector (程序数据矢量)
http://bbs.pinggu.org/thread-2337851-1-1.html
PDV(Program Data Vector)
在SAS参考教程中将PDV定义为:"PDV是内存中用来创建数据集的逻辑区域,每次只涉及一条观测值。
当程序执行时,SAS从输入缓存区中读入数值或通过执行SAS语句创建数值。数据值赋给PDV中一个合适的变量。SAS将该数值作为一条观测值写入SAS数据集。"
换句话说:PDV(Program Data Vector)是内存中的一个存储空间,包含了DATA步涉及的所有变量。
变量出现的顺序决定了在他们在PDV中的顺序。每个变量可能会有一个标记,用于指示他们是被保留(Keep)、舍弃(Drop)或是改名(Rename)。
当程序运行时,PDV包含的观测值被处理。在结束时,数据根据程序中的DROP、KEEP或RENAME标识被输出。
输入缓存区创建完成后,PDV也随即创建完成。PDV是内存中创建数据集的地方,一次仅创建一个观测。像术语输入缓存区(Input buffer)一样,PDV也只是一个逻辑概念。

8.控制输出的列位置
data a;
a=100;
b=300;
put a 10-16 .2 b 20-26 .3;
run;

LOG窗口输出结果:
100.00 300.000

9.数据集选项说明若干举例。
保留部分变量:
data a ;
set ResDat.Class(keep=name sex age);
run;
data b (keep= name sex age);
set ResDat.Class;
run;
data c;
set ResDat.Class;
keep name sex age;
run;
上述三段程序的结果相同。注意,但第三段程序用的是KEEP语句,并不是数据集选项的应用。保留部分变量时可生成多个变量子集,如下:
data weight(keep=name weight) height(keep=name height);
set ResDat.class;
run;/*此程序将保留变量同时生成两个变量子集*/

保留部分观测:
data males;
set ResDat.class;
where sex=’M’;
run;
data males;
set ResDat.class;
if sex=’M’ then output;
run;
data males;
set ResDat.class;
if sex^=’M’ then delete;
run;

data FemaleSt MaleSt ;
set ResDat.class;
if sex='F' then output FemaleSt ;
else if sex='M' then output MaleSt;
run;/* 此程序将保留部分观测同时生成两个观测子集*/

10.DELIMITER=选项应用
例: 要输入的数据用逗号分隔,创建SAS数据集时用选项DELIMITER=’,’
data _null_;
infile cards delimiter=',';
input x y z;
put x y z;
cards;
3,6,9
1,3,5
8,8,8
;

LOG窗口输出结果:
3 6 9
1 3 5
8 8 8

上例加上DSD选项,将两个相邻分隔符之间的数作为缺失值处理
data _null_;
infile cards delimiter=',' DSD;
input test1 test2 test3;
put test1 test2 test3;
cards;
91,87,95
97,,92
, 1 , 1
;

LOG窗口输出结果:
91 87 95
97 . 92
. 1 1
碧水幽幽泉 2017-09-19
  • 打赏
  • 举报
回复
call symput的功能是可以在data step内将值塞到一个macro变量里面。如果这个macro变量已经存在,那这个call就会更新该macro变量的值。
用法: call symput (macro变量, text);
注:不会自动去除值前后的空格
eg.将值Cookie塞入macro变量Gift里面,值必须给予单引号
call symput ('Gift','Cookie');

call symputx基本写法:
call symputx (macro变量, text);
上面提到call symput不会把值的前后空白去掉,但是call symputx会自动去点前后空格

%let 在编译时赋值,call symput 在data 步执行时才赋值,并且要过了这个data步后才能引用。

平时经常使用的宏变量定义方法有三种:
1. %let xxx=yyy; /*%let语句几乎可以在程序的任何位置上去定义宏变量*/
2. Call Symput('xxx','yyy'); /*只能在Date Step中定义*/
3. select xxx into: yyy. /*只能在Proc SQL中定义*/

三种定义方式最大的区别是在MACRO函数内定义所生成的宏变量的类型不同:
Call Symput在宏函数中定义的宏变量可以在函数外调用;而%let和 Select into则不能,
因为这2种方法在MACRO函数内生成的是局部宏变量,若要想在MACRO函数外调用,需事先用%global申明变量类型。
例子:
%macro test();
/*Method 1*/

data _NULL_;
call symput('Today',put(today(),date9.));
run;

/*Method 2*/

/*%let today=%sysfunc(today(),date9.);*/

/*Method 3*/

/*data todaydate;*/
/*date=today();*/
/*Proc sql noprint;*/
/*select put(date,date9.) INTO: today*/
/*from todaydate*/
/*;*/
/*quit;*/
/*%put &today;*/
%mend;
%test;

%put &today;

588

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧