将“ MM.YYYY”转换为SAS日期格式,例如mmyy10

时间:2019-03-01 16:40:52

标签: sas

我有一个字符串'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中的错误

2 个答案:

答案 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;

enter image description here

答案 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));