【问题标题】:SAS - Excel Import DateTime not retaining enough significant digitsSAS - Excel 导入日期时间没有保留足够的有效数字
【发布时间】:2019-08-22 16:18:21
【问题描述】:

正如标题所述,我在将日期时间从 Excel 导入 SAS 时遇到问题。问题似乎与秒有关:

这是来自 excel 的示例数据:

我的日期时间:

这是原始的 excel 数字:

编辑2:

43417.58657407
43417.58656250

当我将它们导入 SAS 时,SAS 是这样显示它们的:

13NOV2018:14:04:39
13NOV2018:14:04:39

和数值:

1857737079
1857737079

我试图弄清楚如何让 SAS 正确读取秒数。我正在使用 proc import,这是我的代码:

proc import
out = MyDSOutput
datafile= MyDSInput
dbms     = EXCEL replace;
sheet    = "page";
getnames = yes;
mixed    = yes;
scantext = yes;
usedate  = no;
scantime = yes;
textsize = 32767;
;
run;

编辑:我应该补充一点,将其转换为 CSV 确实不是一种选择,因为我有 >15 位的数字 ID,而 Excel 会将任何 >15 位的数字转换为 0。

EDIT2:添加了原始 excel 数字的扩展版本

【问题讨论】:

  • 您是否尝试使用 XLSX 数据库引擎(或 XLS,如果这是您拥有的 Excel 文件类型)而不是 EXCEL 引擎?
  • 您能否要求 Excel 为其存储的实际值显示更多小数位?并作为文本而不是图片粘贴到您的问题中。
  • @Tom 没试过 XLSX 引擎,我现在正在研究。我确实更新了帖子以包含 excel 存储的所有数字。
  • 如果您只将一天中的时间部分存储为工作表中自己的列,会发生什么情况?这是否会在当天的同一秒出现并显示?
  • @Tom 我将 proc 导入从 dbms = excel 更改为 dbms = xlsx,这似乎解决了这个问题。我还通过 libname 语句尝试了 XLSX 引擎,这似乎可以解决问题。不过,我可能会坚持使用 proc import。谢谢!

标签: excel date datetime import sas


【解决方案1】:

Excel 将时间存储为一天的一小部分。当您这样做时,不可能准确地表示特定的秒数。那个特定的时间,14:04:40(第二个数字 50,680),特别难以表示为浮点分数。如果您将其表示为 0.58657407 并乘以一天中的秒数,您将得到 50,679.999648 的秒数,这比您想要的略少。

尝试将 DATETIME 字段拆分为单独的 DATE 和 TIME 字段。这样 SAS 将有更多的二进制数字来表示一天中的时间(因为它也不必在一年中的一天有 40K 或 20K 秒)。也许那会接近?或者将值作为字符串存储在 Excel 中,然后使用 SAS 中的 INPUT() 函数将字符串转换为日期时间值。

对于您的 ID 问题,请勿将 ID 值存储为数字,如果可以避免的话,请不要将其存储在任何系统中。如果您可以将 ID 存储在 EXCEL 文件中,那么 EXCEL 可以将其写入 CSV 文件。但是,当您阅读 CSV 文件时,请确保将该列读入字符变量而不是数字变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 2017-08-15
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多