我有一个时间数据字段,比如说,2014年10月1日。 我想在SAS中动态提取月份和年份信息,给定任何日期。
我在SAS中编写了以下代码来提取月份信息:
month = substr(time_field, 1, index(time_field, '/')-1);
这很好。
我写了以下代码片段来提取年份信息:
year = substr(reverse(time_field), 1, 4);
这不起作用;它抛出一片空白。我错过了什么吗?请帮忙。
答案 0 :(得分:1)
data _null_;
length year 4.;
year=year(today());
put "we are on the year of " year;
run;
答案 1 :(得分:1)
您的变量最有可能是尾随空格。因此,当你反转它时,尾随空格成为前导空格,然后你取前面四个空白字符。
您可以通过在变量上单独运行反向功能来验证这一点并查看结果。 尝试添加压缩功能。
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;
答案 2 :(得分:0)
您的数据是字符字段中的一个月,或者是数字值格式化作为日期。虽然你可以在数字上使用文本表达,但你不应该;你应该明确地转换它们。
如果不这样做,那么你最终会得到这样的东西 - 即不正确的字段长度,因为自动转换非常松散。它往往允许在不需要的地方留出大量的额外空间。
如果您的数据是数字,请使用MONTH()或YEAR()并完成它;没有理由在这里播放文字。查看数据资源管理器中的字段;它会告诉你它是否是数字。 (具有格式的数字仍然可以看起来像文本,所以实际看一下!)
如果您的数据是文本,那么您有比REVERSE更好的选项。
首先是SCAN。 SCAN
分词,类似于许多其他语言;经常strsplit
(R)或类似。
month=scan(mdy_var,1,'/');
day =scan(mdy_var,2,'/');
year =scan(mdy_var,3,'/');
其次,您仍然可以使用SUBSTR
以及LENGTH
。
year = scan(mdy_var,length(mdy_var)-3,4);
LENGTH
告诉你字符串到底有多长(减去尾随空格),所以'10 / 1/2014'是9长;第6个字符(9-3)是2,然后是4个字符[应该是不必要的]。这种方法不适用于Day,当然,只有年份(并且只有4位数年份)。扫描更好,但这是一个很好的例子。
沿着相同的路线,您可以使用FIND并使用负起始位置向后看。
year = substr(mdy_var,find(mdy_var,'/',-99)+1,4);
从第99个字符开始(实际上是你的最大值,对吗?)然后向左移动,然后告诉你它找到的第一个'/'的位置。