【问题标题】:Sas changing of date formatSas更改日期格式
【发布时间】:2018-06-11 08:20:13
【问题描述】:

我在 SAS 中有三列日期格式不同:

  1. 12 june 2017 00:15 - 完整日期
  2. 2016 - 仅一年
  3. 12 - 仅一个月

我需要更改日期的格式并在日期后减去以得到月数的结果。

例如,"12 June 2017 00:15" - December 2016 = 7

怎么做?

【问题讨论】:

  • 您说的是原始数据文件还是 SAS 数据集?这些变量中的任何一个都是字符串而不是数字吗?第一个是具有有效 SAS 日期时间值的数字变量吗?如果是这样,实际上并没有一种格式可以完全按照您显示的方式显示它。您是在问如何将 (1) 和 (2 和 3 一起) 转换为日期值?
  • 它是一个 Sas 数据集。第一列是日期格式,第二和第三列是数字。
  • 第一个看起来不像约会。看起来像一个日期时间,因为它有一个时间组件。

标签: date sas


【解决方案1】:

您可能已经发现,没有现成的SAS date informat 可以正确处理您的完整日期字段,因此您需要编写一些自定义逻辑来转换它,然后再进行计算。 date9. 是我能找到的最接近的匹配格式:

data example;
fulldate = '12 june 2017 00:15';
year = 2016;
month = 12;
/* Convert string to date9 format and input */
fulldate_num = input(
  cats(
    scan(fulldate,1),
    substr(scan(fulldate,2,' '),1,3),
    scan(fulldate,3)
  ), date9.
);
/* Calculate difference in months */
monthdiff = intck('month', mdy(month,1,year), fulldate_num);
run;

【讨论】:

    【解决方案2】:
    1. 将“完整日期”字段转换为 SAS 日期值。
    2. 也将年月组合转换为 SAS 日期值。
    3. 使用 INTCK 函数求月差。

    例如:

    数据日期;
    输入 dt $18。 yy 毫米 ;
    mm_diff = intck ("mon", input (cats (yy, mm), yymmn6.), input (dt, anydtdte12.)) ; 把 mm_diff= ;
    卡片;
    2017 年 6 月 12 日 00:15 2016 12
    2018 年 6 月 11 日 00:15 2017 3
    ;
    跑 ;

    日志将打印:

    mm_diff=6 mm_diff=15

    作为旁注,此线程中其他地方的声明“没有现成的 SAS 日期信息可以正确处理您的完整日期字段”是不正确的。正如上面的程序 sn-p 所示,ANYDTDTEw.信息处理它沉着。程序员有责任提供足够的信息宽度W。上面,它被选为W=12。如果您不愿意猜测和/或数数,只需使用 ANYDTDTE32。

    问候, 保罗·多夫曼

    【讨论】:

    • 非常感谢!很有帮助
    【解决方案3】:

    假设您有三个数值变量并且第一个包含有效的 SAS datetime 值,您应该首先将两者都转换为有效的 SAS date 值。然后,您可以使用 INTCK() 函数来计算月份。

     nmonths = intck('month',datepart(VAR1),mdy(VAR3,1,VAR2));
    

    【讨论】:

    • 非常感谢!很有帮助
    猜你喜欢
    • 1970-01-01
    • 2017-10-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多