将字符日期转换为格式化日期

时间:2018-10-31 19:13:17

标签: date sas

我有以下数据集,其中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

如何完成此转换?

3 个答案:

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