【问题标题】:How to read an improperly formatted column from Excel using SAS如何使用 SAS 从 Excel 中读取格式不正确的列
【发布时间】:2013-03-02 11:15:01
【问题描述】:

在发布之前,我尝试了 Google,但没有太多帮助。

我有一个 Excel 文件,在 Opened_DT 列中有这个值:1448300037,15。 Excel 只显示一堆 ###### 字符而不是日期。

我收到了这个文件,但不知道日期格式应该是什么实际输出。它应该说明在机构开设账户的日期。我需要将此 Excel 列导入 SAS 数据集,但这个字符串让我发疯:(我尝试了一堆转换实用程序和插件,但没有运气。

谁能告诉我如何使用 SAS 阅读本专栏?

这是my Excel workbook的示例

【问题讨论】:

  • 你试过加宽列吗?
  • 是的。那是我第一次这样做。然后尝试使用不同的日期格式,但没有运气。即使导入 SAS 也无济于事,SAS 抱怨这个奇怪的日期列
  • 能分享一下文件吗?
  • 我在原始问题中添加了一个数据样本。谢谢
  • Sas datetime 只是一个数字,所以不要将其作为日期导入。将其作为任何数字变量导入,然后将其格式化为 datetime20 之类的格式。

标签: excel sas


【解决方案1】:

从您的示例看来,初始数据是错误的:这是 Excel 2007 向我显示的:

确实,实际值太大而不能是Date - 因为今天的日期序列号是41335。请确保您的应用程序正确计算 Opening_DT 值。

根据Excel specifications and limits

Latest date allowed for calculation         December 31, 9999
Largest amount of time that can be entered  9999:59:59

December 31, 9999 的序列号是 2958465

【讨论】:

  • 感谢您的回答。是否有可能在该数字中编码了其他内容?比如确切的日期、分钟等。这些数据来自一家保险机构,用作论文的一部分,应该导入到 SAS,但在我破解这个奇怪的专栏之前不会发生这种情况。 :(
  • @ryan 我可能只是猜测,但很可能你是对的 - 这似乎是连接/格式错误的值。
【解决方案2】:

在我看来,您的 Excel 工作表中的列是使用某种将小数点转换为逗号的技术创建的。引用的示例值 (1448300037,15) 等效于 SAS 时间戳 22NOV2005:17:33:57.15

如果该值是合法的并且您想将其转换为 SAS 数据集,我建议在 Excel 中将该列格式化为 TEXT,将其保存为新工作簿,然后使用 PROC IMPORT 将该新工作簿读入 SAS。然后对结果进行后处理以将该变量重新读取为 SAS 日期时间变量。举例说明:

proc import out=have
            datafile="path-to-workbook\workbook.xlsx"
            replace
            dbms=excel;
     sheet="sheetname";
run;

data want;
   set have(rename=(Open_DT=prevOpen_DT));
   format Open_DT datetime21.2;
   Open_DT = input(prevOpen_DT,numx13.2);
   drop prevOpen_DT;
run;

input 语句中使用的numx SAS 信息读取字符变量并将逗号解释为小数点。

【讨论】:

  • @Bob_Duell - 我假设 ryan 的区域设置使用逗号作为小数分隔符 - 这是许多欧洲国家/地区的默认设置
  • @barryhoudini 这可能解释了为什么 Ryan 的 Excel 显示 #### 模式;工作簿本身可能是从欧洲地区创建的。关键是他的 Excel 列似乎包含一个 SAS 内部 DAEIME 值(小数点右侧的值是毫秒)。没有 Excel 函数可以将其转换为 Excel DATETIME 值。将列重新格式化为text 并按所示处理即可解决问题。
  • 我对 SAS 一无所知,鲍勃....但是自 1960 年 1 月 1 日以来的值不是秒(不是毫秒)吗?我的回答显示了一种在 Excel 中进行转换的方法 - 我认为它的工作原理与您建议的结果相同,即 22-Nov-2005 17:33:57.15
  • @barryhoudini 是的,你是对的;我说错了毫秒,它是小数秒。是的,SAS 日期时间值是自 1960 年 1 月 1 日以来的秒数。之前回复的时候没看到你的回答;我相信它也会起作用,但同样需要更改工作簿(插入新列?)。不能说哪个“更好”,但我从你的回答中学到了一些关于 Excel 的知识。
【解决方案3】:

我假设您所在地区的小数分隔符是逗号,所以 1448300037,15 是一个有效数字......

如果这表示从 1960 年 1 月 1 日开始的秒数,那么在 Excel 中,您可以通过将开始日期(1960 年 1 月 1 日)添加到以天数表示的数字(您可以通过除以一天中的秒数),因此对于 A2 中的数据,请使用此公式

=DATE(1960,1,1)+A2/86400

并格式化为日期/时间,例如dd.mm.yyyy hh:mm

【讨论】:

    【解决方案4】:

    使列宽变宽。如果数据不合适,Excel 有时会显示哈希值。

    【讨论】:

    • 是的。那是我第一次这样做。然后尝试使用不同的日期格式,但没有运气。看起来 Excel 无法理解我要转换的内容/我使用的格式:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多