我有一个字符串'MM.YYYY'
,并希望将其转换为SAS中的日期格式-类似于format mmyy10.
。我知道,由于我想念这一天,所以不能使用任何SAS day format
。
现在我正在解决以下问题:
data testdate;
chardate = '06.2010';
ch_month = int(chardate);
ch_year = (chardate-ch_month)*10000;
date = mdy(ch_month,15,ch_year);
format date mmyy10.;
run;
proc print data=testdate;
run;
我有一个问题-年将比我的预期少一年。所以我的输出是06M2009
?我没有任何错误。此代码有什么问题?另一件事-有(我敢打赌)有更好/更精细的方法来解决此问题?
编辑:由于@Reeza,修复了MWE中的错误
答案 0 :(得分:2)
有两种方法可以将其转换为SAS日期。即使未显示,SAS日期也必须包含“天”部分。我在这里将其设置为1。
INPUT()将字符转换为数字,以避免在日志中进行转换注释 SUBSTR()从字符串获取月/年。
date = mdy(input(substr(chardate, 2, 2), 8.), 1, input(substr(chardate, 4, 4), 8.));
或者另一种方法是直接使用INPUT。 首先使用COMPRESS()函数删除句点,然后将01连接到日期的开头,并将其读取为DDMMYY格式的日期。
date2 = input(compress('01'||chardate, "."), ddmmyy10.);
完整代码在这里:
data testdate;
chardate = '06.2010';
date = mdy(input(substr(chardate, 2, 2), 8.), 1, input(substr(chardate, 4, 4), 8.));
date2 = input(compress('01'||chardate, "."), ddmmyy10.);
format date: mmyy10.;
run;
proc print ;
run;
答案 1 :(得分:2)
只需使用INPUT()函数。添加一个月中的某一天,以便输入有效的日期值。
date = input('01.'||chardate,ddmmyy10.);
您的原始计算使用隐式类型转换,而不考虑使用浮点算法。添加BEST32。格式以查看您的实际值。
data testdate;
chardate = '06.2010';
ch_month = int(chardate);
ch_year = (chardate-ch_month)*10000;
date = mdy(ch_month,15,ch_year);
format _numeric_ best32. date yymmdd10.;
put (_all_) (=);
run;
NOTE: Character values have been converted to numeric values at the places given by: (Line):(Column).
108:17 109:18
chardate=06.2010 ch_month=6 ch_year=2009.99999999999 date=2009-06-15
NOTE: The data set WORK.TESTDATE has 1 observations and 5 variables.
尝试添加ROUND()函数调用
date = mdy(ch_month,15,round(ch_year,1));