我的数据集(当前是数字)中有一个日期变量,它有三种日期类型:
就在这一年(yyyy)
年/月(yyyymm)
年/月/日(yyyymmdd)
我试图将只有年份的那些转换为1月1日,然后将年/月的转换为月份的第一个,以便我可以从我的数据集中的另一个日期变量中减去日期所有日期都是yymmdd8格式(与#3相同)。我在数据步骤中尝试了这个并且它无法正常工作:
if length(Date)=4 then DateF=mdy(1,1,substr(Date,1,4));
if length(Date)=6 then DateF=mdy(substr(Date,5,2),1,substr(Date,1,4));
if length(Date)=8 then DateF=mdy(substr(Date,5,2),substr(Date,7,2),substr(Date,1,4));
Date2=input(put(DateF,8.),YYMMDD8.);
format Date2 YYMMDD8.;
有人可以告诉我我的代码有什么问题吗?谢谢!
答案 0 :(得分:3)
因此,要调试代码,您可以先尝试将一些假设打印到屏幕上。我首先打印您的if
声明的结果......
data blah;
format date best.;
input date;
test1 = length(date);
put test1=;
datalines;
2014
201408
20140829
;
run;
这给出了:
test1=12
test1=12
test1=12
显然不是我们所期待的。一旦数字字段自动转换为字符变量,它看起来像是12个字符长,当它被转换时,它在前面填充空格。我们可以通过将put语句替换为:
来检查这一点test2 = "*" || length(cats(date)) || "*";
put test2=;
打印:
test2=* 4*
test2=* 6*
test2=* 8*
所以我们需要做的是不依赖于自动类型转换,因为这不仅会影响if
条件,还会影响substr()
函数。相反,我们会自己做:
data blah;
format date best.;
input date;
tmp_date = cats(date);
if length(tmp_Date)=4 then DateF=mdy(1,1,substr(tmp_Date,1,4));
if length(tmp_Date)=6 then DateF=mdy(substr(tmp_Date,5,2),1,substr(tmp_Date,1,4));
if length(tmp_Date)=8 then DateF=mdy(substr(tmp_Date,5,2),substr(tmp_Date,7,2),substr(tmp_Date,1,4));
format Datef YYMMDD8.;
datalines;
2014
201408
20140829
;
run;
cats()
函数将为我们进行转换,并修剪前导和尾随空格!它非常实用......无论如何,希望能解释出现什么问题,以及如何在将来调试自己的代码=。)。