SAS 日期格式 - 努力获得更整洁的解决方案

SAS date format - Struggling to get a neater solution

提问人:Jesper van Beemdelust 提问时间:10/27/2023 更新时间:10/28/2023 访问量:45

问:

我目前不在工作场所,所以我稍后会更新。从本质上讲,我想要的是将日期列转换为 2023 年 1 月 2 日(荷兰月份名称)

我已经建立了一个日期表,只是使用子字符串添加了一个额外的列,并将 JAN 替换为 Januari,将 FEB 替换为 Februari,将 MAR 替换为 Maart 等。从那里开始,我只是在最终表格中的每个日期列(有 8 个日期列)上加入它。

现在一个更简洁的解决方案是为此创建一个 FORMAT,但我无法做到这一点。您可能拥有的任何参考资料或代码都将非常有用。

就我个人而言,我已经尝试过这个,阅读了一些文档和 chatgpt,但我还没有设法让它工作。

    proc format;
  value $dutch_month_abbrev (default = 20)
  'JAN' = 'Januari'
  'FEB' = 'Februari'
  'MAR' = 'Maart'
  'APR' = 'April'
  'MAY' = 'Mei'
  'JUN' = 'Juni'
  'JUL' = 'Juli'
  'AUG' = 'Augustus'
  'SEP' = 'September'
  'OCT' = 'Oktober'
  'NOV' = 'November'
  'DEC' = 'December';
  
  value mydate (date)
  low-< '01JAN2023'd = ddmmyy.-[$dutch_month_abbrev.]-yyyy4.
  '01JAN2023'd - high = ddmmyy.-[$dutch_month_abbrev.]-yyyy4.;
run;
SAS 日期格式

评论


答:

1赞 Stickleback 10/27/2023 #1

我相信SAS为此目的提供了预构建的格式:

DATA output;
    SET input;

    new_date_col = put(old_date_col, NLDDFWDX29.);

RUN;

以下是演示如何在其他语言中实现此功能的文档:

https://www.sfu.ca/sasdoc/sashtml/lgref/z0205146.htm

请注意,29.长度可以减少,但需要考虑潜在的截断,具体取决于月份名称 + 日和年数字的长度。

或者,您可以保留日期值/功能,并覆盖格式:

DATA output;
    SET input;

    format old_date_col NLDDFWDX29.;

RUN;
2赞 data _null_ 10/27/2023 #2

来自 SAS 文档

options dflang=dutch;
    data _null_;
    input date;
    put date eurdfwdx29.;
    put date nlddfwdx29.
    put date itadfwdx17.;
    datalines;
    15342
    ;
0赞 Therkel 10/27/2023 #3

SAS 帮助中心上的 FORMAT Procedure 的启发,您似乎想要使用某种格式。picture

PROC FORMAT;
   PICTURE dmy(DEFAULT = 8) OTHER = '%0d%0b%Y' (DATATYPE = date);
RUN;

OPTION LOCALE = nl_NL;

DATA _NULL_ ;
    DO m = 1 to 12;
        date = MDY(m,1,2023);
        PUT date = DMY.;
    END;
RUN;

这会写入日志

date=01jan202
date=01feb202
date=01mrt202
date=01apr202
date=01mei202
date=01jun202
date=01jul202
date=01aug202
date=01sep202
date=01okt202
date=01nov202
date=01dec202