【问题标题】:What is the SAS format and informat for "mm/dd/yyyy hh:mm:ss"?“mm/dd/yyyy hh:mm:ss”的 SAS 格式和信息是什么?
【发布时间】:2015-05-27 12:21:21
【问题描述】:

问题

请问mm/dd/yyyy hh:mm:ss 中是否有内置的 SAS 格式和日期时间信息?例如:

06/25/2015 03:02:01(2015 年 6 月 25 日,3 点 2 分 1 秒)。

背景

我正在尝试将 CSV 平面文件解析为 SAS 数据集,其中日期时间列当前以 mm/dd/yyyy hh:mi:ss 格式显示。我通常只是将其读取为字符串,然后使用substr() 函数选择日期和时间部分(作为字符串),使用 informat 解析 SAS 日期和时间(作为数字),然后将它们组合在一起形成一个 SAS 日期时间(作为数字)。我猜可能有一种更清洁的方法可以做到这一点,因此很好奇mm/dd/yyyy hh:mm:ss 是否已经有一个内置的 SAS 日期时间,这将使我能够在一次解析中读取它,如下所示:

data test;
    infile "c:\temp\test.csv" dlm=',' missover;
    input 
        dtvar : <the datetime format for mm/dd/yyyy hh:mm:ss>.
        var1 $
        var2 $
        ;
    format dtvar DATETIME19.;
run;

我在这方面做了很多谷歌搜索,但没有运气。非常感谢!

编辑/更新(关于额外的研究工作和发现)

在收到大量论坛回复后,我对定制(自制)格式 mdyhms 和 SAS 内置格式 mdyampm 进行了比较。

成功的因素有:

  • 格式案例:能够将1748351045显示为“06/25/2015 03:02:01”
  • Informat 案例:能够将“06/25/2015 03:02:01”转换为 1748351045

定制格式mdyhms 如下所示:

proc format;
  picture mdyhms
  other = '%0m/%0d/%Y %0H:%0M:%0S' (datatype=datetime);
run;

下面的比较练习揭示了一些有趣的观察结果:

  • 格式案例:定制格式mdyhms 是赢家。
  • Informat 案例:内置格式mdyampm 胜出。

现在是比较练习...

格式化大小写

*** bespoke mdyhms as a format (Winner);
data try_format_mdyhms;
  x = "25JUN2015:03:02:01"dt;  /* 1750820521 */
  put x;                       /* 1750820521 */
  put x:mdyhms.;               /* 06/25/2015 03:02:01 */
run;

*** built-in mdyampm as a format (Loser);
data try_format_mdyampm;
  x = "25JUN2015:03:02:01"dt;  
  put x;                       /* 1750820521 */
  put x:mdyampm.;              /* 6/25/2015  3:02 AM */
run;

通知案例

*** bespoke mdyhms as an informat (Loser);
data try_informat_mdyhms;
  x = input("06/25/2015 03:02:01",mdyhms.);  /* informat fail (error) */
  put x; 
run;

*** built-in mdyampm as an informat (Winner);
data try_informat_mdyampm;
  x = input("06/25/2015 03:02:01",mdyampm.);  /* 1750820521 */
  put x;                                      /* 1750820521 */
run;

下一步:

是否有任何内置(和/或定制)格式可以根据以下成功因素同时启用格式和信息:

  • 格式案例:能够将1748351045显示为“06/25/2015 03:02:01”
  • Informat 案例:能够将“06/25/2015 03:02:01”转换为 1748351045

(定制的mdyhms 和内置的mdyampm 似乎能够实现两者之一,但不能同时实现)。还是我错过了什么?

【问题讨论】:

标签: datetime format sas informat


【解决方案1】:

有两种信息可以读取文本“06/25/2015 03:02:01”并将其转换为正确的 SAS 日期时间值: ANYDTDTM 和 MDYAMPM

【讨论】:

  • 这看起来不错 - MDYAMPM informat 可能更安全,但我认为使用 ANYDTDTM 您可能会面临误读日期的风险,例如 05/01/2015 被读取为 01MAY05JAN
【解决方案2】:

查看 stackoverflow 答案 here 以了解使用日期时间值。您应该能够更新它:

proc format ;
  picture mdyhms 
  other='%0m/%0d/%0Y %0H:%0M:%0S' (datatype=datetime)
;run ;

【讨论】:

  • 实际上 - 您需要稍微调整一下以包含您拥有的第二个:other='%0m/%0d/%0Y %0H:%0M:%0S'
  • 不幸的是,图片格式不能用作信息,所以我怀疑这在这种情况下并不是非常有用。
  • 链接问题中还有一个步骤,尽管使用cntlin 的输入格式生成信息......尽管@stigeide 指出MDYAMPM 信息更好...... !
猜你喜欢
  • 2013-03-21
  • 2017-07-09
  • 2015-11-03
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 2019-10-29
相关资源
最近更新 更多