【问题标题】:Error while formatting the date variables in sas在 sas 中格式化日期变量时出错
【发布时间】:2015-01-01 11:48:16
【问题描述】:

当我尝试对日期变量进行格式化时遇到错误。

这就是我的日期变量值看起来像“26-Dec-58​​strong>”的样子

"$DATE 格式未找到或无法加载"

错误的原因是我的日期值在数据集中存储为 char 变量,因此在我格式化变量时它不接受数字变量的格式。

所以我想在不引入新变量的情况下将我的日期(这是一个字符)变量转换为数值变量。

我尝试了 datepartsubstring 选项,但仍然出现错误。

我仍处于 sas 的学习阶段,因此感谢任何清除错误的代码我知道这个概念,但我尝试了所有我知道的编码,但仍然没有运气。

当前代码:

data Practice.Sales; 
    set Practice.Sales; 
    Birthdate = '26-Dec-58'; 
    Purchase_Dt = '15-Sep-04'; 
    t_num_date = input(Birthdate, ddmmyy8.); 
    t_num_date1 = input(Purchase_Dt, ddmmyy8.); 
    drop Birthdate Purchase_Dt; 
    format Birth_date ddmmyy8. PurchaseDt ddmmyy8. Price DOLLAR10.2; 
    rename t_num_date = Birthdate; 
    rename t_num_date1 = Purchase_Dt; 
run;

【问题讨论】:

  • 这引出了一个问题 - 如果您对日期进行硬编码,为什么不首先将它们定义为日期? Birthdate = '26Dec1958'd; format Birthdate date9.;
  • 无论如何,这些语句不会产生上述错误。您还没有向我们展示什么?

标签: format sas


【解决方案1】:

无法将 SAS 数据集中的现有变量直接从字符更改为数字。但是,您可以创建一个新的数值变量,删除原来的字符变量,然后重命名新的:

data example;
    mydate = '26-Dec-58';
    t_num_date  = input(mydate, date9.);
    drop mydate;
    format t_num_date date9.;
    rename t_num_date = mydate;
    output;
run;

注意您必须在重命名之前将格式应用于临时变量。重命名后尝试应用数字格式会导致错误,因为格式语句是在数据步骤的其余部分运行之前处理的,此时尚未删除原始字符变量。

【讨论】:

  • 数据实践.销售;设置练习。销售;生日 = '26-Dec-58'; Purchase_Dt = '15-Sep-04'; t_num_date = 输入(出生日期,ddmmyy8.); t_num_date1 = 输入(Purchase_Dt,ddmmyy8.);删除生日购买_Dt;格式 Birth_date ddmmyy8.购买Dt ddmmyy8。价格 DOLLAR10.2;重命名 t_num_date = 生日;重命名 t_num_date1 = Purchase_Dt;跑;这是我的代码。这不起作用只是将新变量最后添加到旧变量中,所有数据点都为空白
  • 正如我上面提到的,在重命名临时变量之前,您必须将格式应用于临时变量。此外,ddmmyy8. 在这里不起作用 - 您需要使用 date9.
  • @Wasim 您应该编辑您的问题,而不是 cmets 中的邮政编码。
【解决方案2】:

这段代码对我来说很好,但新创建的变量最后还是出现了如何改变它

  data Practice.Sales;
  set Practice.Sales;
    Birth_date=datepart(input(Birthdate,anydtdtm19.));
    PurchaseDt = datepart(input(Purchase_Dt,anydtdtm19.));
        format Birth_date PurchaseDt ddmmyy8. Price DOLLAR10.2;
        drop Birthdate Purchase_Dt;
    run;

【讨论】:

  • 在 set 语句中重命名旧变量,然后将它们放在末尾。
  • 鉴于您的问题,它指出日期看起来像 58 年 12 月 26 日,因此使用日期时间输入没有意义,因为没有时间部分。你确定这给了你正确的价值观吗?
【解决方案3】:

您需要使用 rename at set 语句,然后将它们放在最后。

 data Practice.Sales;
  set Practice.Sales 
   *rename old variables;
  (rename=(birthdate=birth_date purchase_dt=purchasedt));

  *use renamed variables in code;
  Birthdate=datepart(input(Birth_date,anydtdtm19.));
  Purchase_Dt = datepart(input(PurchaseDt,anydtdtm19.));

  format Birthdate Purchase_Dt date9. Price DOLLAR10.2;

  drop Birth_date PurchaseDt;
run;

【讨论】:

    【解决方案4】:

    SAS 数据集中的变量按照它们的创建顺序显示。 如果您真的想自己确定变量的顺序,那么您应该在 set 语句之前创建它们。此外,我想您更喜欢不更改变量的名称,同时仍然更改它们的类型。因此,我们必须在读取现有变量时重命名它们。

      data Practice.Sales;
        format Birthdate Purchase_Dt ddmmyy8. Price DOLLAR10.2;
    
        set Practice.Sales (rename =(Birthdate=oldBirth Purchase_Dt = oldPurchase));
    
        Birthdate=datepart(input(oldBirth,anydtdtm19.));
        Purchase_Dt = datepart(input(oldPurchase,anydtdtm19.));
    
        drop Birthdate Purchase_Dt;
      run;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 2014-08-16
      相关资源
      最近更新 更多