我有一个时间数据字段,比如10/1/2014。我想在给定任何日期的情况下,在SAS中动态提取月份和年份信息。
我在SAS中编写了以下代码来提取月份信息:
month = substr(time_field, 1, index(time_field, '/')-1);这样做效果很好。
我编写了以下代码片段来提取年份信息:
year = substr(reverse(time_field), 1, 4);这不起作用;它抛出一个空白。我错过了什么吗?请帮帮忙。
发布于 2015-01-07 03:35:47
SAS将为您返回年份。不需要为此目的编写任何自定义函数。看:
data _null_;
length year 4.;
year=year(today());
put "we are on the year of " year;
run;发布于 2015-01-07 03:52:25
您的变量最有可能包含尾随空格。所以当你颠倒它的时候,尾随的空格变成了前导空格,然后你取了前四个字符,它们是空格。
您可以通过单独对变量运行反向函数来验证这一点,并查看结果。尝试添加compress函数。
year = substr(reverse(compress(time_field)), 1, 4);尽管这可能会解决您的问题,但您确实应该将日期转换为SAS日期,然后使用月/日/年函数。
data have;
length time_field $20.;
time_field="10/1/2014";
year_bad = substr(reverse(time_field),1, 4);
year_good = reverse(substr(reverse(compress(time_field)),1, 4));
year_better = year(input(time_field, mmddyy10.));
put "year_bad:" year_bad;
put "year_good:" year_good;
put "year_better:" year_better;
run;发布于 2015-01-07 07:15:29
您的数据可以是字符字段中的月份,也可以是格式化为日期的数值。虽然您可以在数字上使用文本表达式,但您不应该这样做;您应该显式地转换它们。
如果你不这样做,那么你最终会得到这样的结果--比如,字段的长度不合适,因为自动转换非常松散。它倾向于在不需要的地方允许大量的额外空间。
如果您的数据是数值型的,请使用MONTH()或YEAR()并对其进行处理;这里没有理由使用文本。查看data explorer中的字段;它会告诉您它是否是数字。(具有某种格式的数字看起来仍然像文本,所以请实际查看它!)
如果您的数据是文本,那么您有一些比反向更好的选择。
首先是扫描。SCAN按单词拆分,类似于许多其他语言;通常是strsplit (R)或类似语言。
month=scan(mdy_var,1,'/');
day =scan(mdy_var,2,'/');
year =scan(mdy_var,3,'/');其次,您仍然可以与LENGTH一起使用SUBSTR。
year = scan(mdy_var,length(mdy_var)-3,4);LENGTH告诉你字符串的实际长度(减去尾随空格),所以'10/1/2014‘是9长;6个字符(9-3)是2,然后是4个字符,这应该是不必要的。当然,这种方法不适用于Day,只适用于year (并且只适用于4位数的year)。扫描确实更好,但这是一个很好的例子来说明它是如何工作的。
沿着同样的路线,你可以使用FIND和look,也可以使用负的开始位置。
year = substr(mdy_var,find(mdy_var,'/',-99)+1,4);从第99个字符开始(实际上这是您的最大值,对吧?)然后向左转,然后告诉你第一个'/‘的位置。
https://stackoverflow.com/questions/27805125
复制相似问题