将文本数据转换为日期

Convert text data to Date

我正在从 xlsx 文件中读取数据,其中有一列包含文本值 ('Cancelled'、'Postponed'、'1-01-2018')。我想将此列转换为日期类型。

我宁愿避免使用 SAS,如果可能的话,我会使用 PROC SQL 来完成这件事

我尝试使用 PROC SQL,但我在 SQL 中找不到任何描述 SAS

中可用的有效日期函数的地方
    CREATE TABLE fixed_date AS
        SELECT
            start_date,datepart(end_date) as formatted_date
        FROM
            input_file
        WHERE end_date_validity = 1;
QUIT;

我期待一个包含我可以对其进行日期算术的列的数据集。我目前收到错误:

ERROR: Wrong number of arguments for function datepart

具有 'mixed' 类型数据的 Excel 列在导入 SAS 时将变为字符类型。您将需要创建一个新列,其中带有 'date' 字符串的行将包含 SAS 日期值,不包含日期字符串的行将是缺失值——INPUT 函数可以用于将日期字符串转换为日期值。

例如

proc sql;
  create table have (delivery_date char(20));
  insert into have 
    values ('Cancelled') 
    values ('Postponed')
    values ('1-01-2018')
  ;

  create table want as
  select 
    delivery_date as delivery_date_string,                               /* keep column of original data  */
    input (delivery_date, ? mmddyy10.) as delivery_date format=yymmdd10. /* create new column as date value */
  from 
    have
  ;

因为你知道INPUT会遇到一些非日期字符串,所以我在信息格式(mmddyy10.)之前添加了问号(?)修饰符。修饰符将阻止日志注释,例如

NOTE: Invalid date value
NOTE: Invalid argument to function INPUT. Missing values may be generated.

来自 INPUT

的文档

? or ??

specifies the optional question mark (?) and double question mark (??) modifiers that suppress the printing of error messages and input lines when invalid data values are read. The ? modifier suppresses the invalid data message. The ?? modifier suppresses the invalid data message and prevents the automatic variable _ ERROR _ from being set to 1 when invalid data is read.

另外,??只能在数据步中使用。