我有以下数据集,其中date
中的值具有常规格式<character d>mmyy
:
DATA df;
INPUT date $;
DATALINES;
d0101
d0102
d0103
d0104
;
RUN;
我希望df
中的每一行都变成以下(数字/日期类型):
01JAN2018
02JAN2018
03JAN2018
04JAN2018
这是我的尝试:
DATA df_new;
SET df;
FORMAT date DATE9.;
date = INPUT(SUBSTR(date, 2, 2) || PUT(INPUT(SUBSTR(date, 4, 2), 8.), MONNAME3.) || PUT(YEAR(TODAY()), 4.), DATE9.);
RUN;
但是,这只是给我以下内容:
21185
21185
21185
21185
如何完成此转换?
答案 0 :(得分:2)
您正在应用格式,但是 date 变量仍包含数字值(自SAS Epoch以来的天数)。 您还错误地重用了 date 变量。在 df 数据集中,它被创建为字符,在 df_new 中,您正在向其中写入数字值。因此,要解决此问题,请在 df_new 数据集中将日期更改为 dateN 。最后要将其转换为字符,您需要再执行一步:
...
dateN = input(substr(date, 2, 2) || put(input(substr(date, 4, 2), 8.), monName3.) || put(year(today()), 4.), date9.);
length dateC $9;
dateC = put(dateN, date9.)
...
答案 1 :(得分:2)
类似以下使用mdy函数并应用date9的操作。通过mdy函数创建日期后,请进行格式设置,这可能需要一个月日和一年中的某个日期
DATA df; INPUT date $; DATALINES; d0101 d0102 d0103 d0104 ; RUN;
data want;
set df;
new_date=mdy(input(substr(date,2,2),2.), input(substr(date,4,2),2.), year(today()));
format new_date date9.;
run;
您也可以使用
new_date=mdy(substr(date,2,2), substr(date,4,2), year(today()));
但是它将在您的日志中显示以下消息
NOTE: Character values have been converted to numeric values at the places
given by: (Line):(Column).
答案 2 :(得分:1)
转换与我在另一个问题中回答的转换相同。
无需提取带有假定构造d<mm><dd>
的字符串中的数字内容,以输入到MDY
中。取而代之的是,充实日期的字符串表示形式,并使用带有日期信息的input
来建立SAS日期值(这只是一个数字,代表自SAS日期纪元以来的天数,即01JAN1960)。 SAS日期值根据格式呈现。如果不加格式化,则只会看到一个整数。将变量格式化为date9.
将导致输出呈现适当的<dd><mon><yyyy>
,或格式化yymmdd10.
将其呈现为<yyyy>-<mm>-<dd>
date_value = input (cats(year(today()), substr(date,2)), yymmdd10.);
format date_value date9.;
或更明确地
year_string = cats(year(today());
mmdd_string = substr(date,2);
yyyymmdd_string = cats(year_string,mmdd_string);
date_value = input(yyyymmdd_string, yymmdd10.);
format date_value date9.;
如果您绝对需要(不太可能)将以字符串形式显示的日期存储回原始的date变量中,则必须使用put
强制在值分配时进行呈现。
date = put(date_value, date9.);