【问题标题】:SAS: Converting numeric to character valuesSAS:将数字转换为字符值
【发布时间】:2020-10-21 18:50:20
【问题描述】:

我正在尝试转换 datatime20.从数字到字符值。 目前我有这样的数值:01Jan200:00:00:00,我需要将其转换为字符值并接收到如下输出:2020-01-01 00:00:00.0

aboved 中应该使用什么格式和信息? 我尝试使用 PUT 函数将数字转换为字符并尝试了很多选项,每次都接收其他格式。在 PUT 之前也应该使用 DHMS 函数?

【问题讨论】:

  • 请告诉我们您的尝试。

标签: sas


【解决方案1】:

没有一种本机格式可以准确地生成该字符串。但是使用现有格式逐步构建它并不难。或者您可以使用 PROC FORMAT 中的 PICTURE 语句来构建您自己的格式。

如果您并不真正关心 datetime 值的时间部分,那么这是一种简单易懂的方法,可以将带有秒数的数值变量 DT 转换为该样式的新字符变量。使用 DATEPART() 从日期时间值中获取日期(天数),然后使用 YYMMDD 格式为日期生成 10 个字符的字符串,然后只需附加格式化零的常量字符串。

length dt_string $21.;
dt_string = put(datepart(dt),yymmdd10.)||' 00:00:00.0';

如果您需要一天中的时间部分,那么您也可以使用 TOD 格式。

dt_string = put(datepart(dt),yymmdd10.)||put(dt,tod11.1);

或者您可以使用 E8601DT21.1 格式,然后将日期和时间之间的字母 T 改为空格。

dt_string = translate(put(dt,E8601DT21.1),' ','T');

如果您想弄清楚日期时间值存在哪些格式以及格式化后的结果是什么样的,您可以运行一个小程序从元数据中提取格式并将它们应用于特定的日期时间值。

data datetime_formats;
   length format $50 string $80 ;
   set sashelp.vformat;
   where fmttype='F';
   where also fmtinfo(fmtname,'cat')='datetime';
   keep format string fmtname maxw minw maxd ;
   format=cats(fmtname,maxw,'.','-L');
   string=putn('01Jan2020:01:02:03'dt,format);
run;

【讨论】:

    【解决方案2】:

    可以定义自定义格式以返回用户定义函数的结果。 Docs

    proc format;
      value <format-name> (default=<width>)
        other = [<function-name>()]
      ;
    run;
    

    例子:

    options cmplib=(sasuser.functions);
    
    proc fcmp outlib=sasuser.functions.temporal;
    
      function E8601DTS (datetime) $21;
        return (
          translate (putn(datetime,'E8601DT21.1'),' ','T')
        );
      endsub;
    
    run;
    
    proc format;
      value E8601DTS (default=21)
        other = [E8601DTS()]
      ;
    run;
    
    data have;
      do dt = '01jan2020:0:0'dt to '10jan2020:0:0'dt by '60:00't;
        output;
      end;
      format dt datetime16.;
    run;
    
    ods html file='function-based-format.html';
    
    proc print data=have(obs=4); title 'stock E8601DT';
    proc print data=have(obs=4); title 'custom E8601DTS';
      format dt E8601DTS.;
    run;
      
    ods html close;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 2016-08-30
      • 1970-01-01
      相关资源
      最近更新 更多