首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SAS中的反向功能是如何工作的?

SAS中的反向功能是如何工作的?
EN

Stack Overflow用户
提问于 2015-01-07 02:47:43
回答 3查看 3.5K关注 0票数 0

我有一个时间数据字段,比如10/1/2014。我想在给定任何日期的情况下,在SAS中动态提取月份和年份信息。

我在SAS中编写了以下代码来提取月份信息:

代码语言:javascript
运行
复制
month = substr(time_field, 1, index(time_field, '/')-1);

这样做效果很好。

我编写了以下代码片段来提取年份信息:

代码语言:javascript
运行
复制
year = substr(reverse(time_field), 1, 4);

这不起作用;它抛出一个空白。我错过了什么吗?请帮帮忙。

EN

回答 3

Stack Overflow用户

发布于 2015-01-07 03:35:47

SAS将为您返回年份。不需要为此目的编写任何自定义函数。看:

代码语言:javascript
运行
复制
data _null_;
    length year 4.;
    year=year(today());
    put "we are on the year of " year;
run;
票数 1
EN

Stack Overflow用户

发布于 2015-01-07 03:52:25

您的变量最有可能包含尾随空格。所以当你颠倒它的时候,尾随的空格变成了前导空格,然后你取了前四个字符,它们是空格。

您可以通过单独对变量运行反向函数来验证这一点,并查看结果。尝试添加compress函数。

代码语言:javascript
运行
复制
year = substr(reverse(compress(time_field)), 1, 4);

尽管这可能会解决您的问题,但您确实应该将日期转换为SAS日期,然后使用月/日/年函数。

代码语言:javascript
运行
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2015-01-07 07:15:29

您的数据可以是字符字段中的月份,也可以是格式化为日期的数值。虽然您可以在数字上使用文本表达式,但您不应该这样做;您应该显式地转换它们。

如果你不这样做,那么你最终会得到这样的结果--比如,字段的长度不合适,因为自动转换非常松散。它倾向于在不需要的地方允许大量的额外空间。

如果您的数据是数值型的,请使用MONTH()或YEAR()并对其进行处理;这里没有理由使用文本。查看data explorer中的字段;它会告诉您它是否是数字。(具有某种格式的数字看起来仍然像文本,所以请实际查看它!)

如果您的数据是文本,那么您有一些比反向更好的选择。

首先是扫描。SCAN按单词拆分,类似于许多其他语言;通常是strsplit (R)或类似语言。

代码语言:javascript
运行
复制
month=scan(mdy_var,1,'/');
day  =scan(mdy_var,2,'/');
year =scan(mdy_var,3,'/');

其次,您仍然可以与LENGTH一起使用SUBSTR

代码语言:javascript
运行
复制
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,也可以使用负的开始位置。

代码语言:javascript
运行
复制
year = substr(mdy_var,find(mdy_var,'/',-99)+1,4);

从第99个字符开始(实际上这是您的最大值,对吧?)然后向左转,然后告诉你第一个'/‘的位置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27805125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档