【问题标题】:Convert Character Date variable to SAS Date将字符日期变量转换为 SAS 日期
【发布时间】:2015-12-13 21:00:33
【问题描述】:

我在读取到 SAS 的 Excel 文件中有以下名为 Date 的变量:

Date
May2005
June2005
July2005
..
July2015

格式和信息都是字符($8)

我想将这些转换为 SAS 日期变量。 我怎样才能完成这项任务?

我考虑过使用 substr 先创建一个月份和年份变量, 然后使用 proc 格式将所有月份转换为数字(例如 'jan' = 1)。 使用 mdy date 函数创建一个新的日期。但我想知道是否有更短的方法来完成这项任务?

【问题讨论】:

    标签: date sas character numeric


    【解决方案1】:

    您可以使用 ANYDTDTE。如果您在月份+年份字符串前面加上一天,请提供信息。

    data want ;
      set have ;
      actual_date = input('01'||date,anydtdte.);
      format actual_date date9.;
    run;
    

    请注意,附加到字符变量的 FORMAT 或 INFORMAT 是没有意义的,但是只有长度为 8 的变量将没有空间存储更长的月份名称。也许长度设置为仅 8,因为您的特定示例数据集不包含任何更长的月份名称。

    如果您运行的是旧版本的 SAS,那么 ANYDTDTE. informat 不存在或无法完全拼写几个月,那么您将需要更加努力地工作。您可以将字符串转换为 DATE9 格式。

      actual_date = input
        ('01'||substr(date,1,3)||substr(date,length(date)-3)
        ,DATE9.);
    

    【讨论】:

    • 我运行了这个......它给了我实际日期的缺失值。
    • 显示无效的 DATE 值。例如,您可以添加如下一行:if missing(actual_date) then put date= :$quote.;
    • 它将 Date= 放入日志(其中的一列)。
    • 那么,哪些 DATE 示例值不起作用?我测试了月份名称的每个可能的有效值。如果您的值被截断为 8 个字符,那么 'NOVEMBER2015' 将被截断为 'NOVEMBER' 并且由于它没有年份值,所以这将不起作用。另外您使用的是什么版本的 SAS?
    • 他们都没有工作。以下是 proc 内容的详细信息:# Variable Type Len Format Informat Label 1 Date Char 8 $8。 8 美元。我使用 SAS 9.0 的日期
    【解决方案2】:

    正如@Tom 所暗示的,在读取字符日期时,您必须使用 SAS 可以将其解释为数值的信息。我不确定是否有一个读取 MONTHYYYYw.,(当然,ANYDTDTE 有效,但我更愿意避免它)。在这种情况下,我会使用 MONYYw.,结合 substr 来获得长度为 3 个月的缩写和 2 位数的年份:

    data have;
      input Date $13.;
      datalines;
      January2005
      Feburary2005
      March2005
      April2005
      May2005
      June2005
      July2005
      August2005
      September2005
      October2005
      November2005
      December2005
      ;
    run;
    
    data want;
      set have;
      Date2 = input(SUBSTR(Date,1,3)||SUBSTR(Date,length(date)-1,2),MONYY13.);
      Format Date2 DATE8.;
    run;
    
    proc print data = want; run;
    

    【讨论】:

    • 你能告诉我上面代码中的“II”是做什么的吗?
    • 是的,SAS 中的|| 是一个连接运算符,用于将两个字符串连接在一起。
    • 您还可以查看 catcatscattcatx 以了解 SAS 中的连接。
    • 如果这确实解决了您的问题,请随时将其标记为答案。谢谢。
    猜你喜欢
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多