强制导入Excel日期列的格式JMP 社区您好,
我正在寻求有关通过 JSL 使用 Excel 导入向导强制导入日期格式的帮助。 我正在尝试导入 Excel 文件中仅两列的数据,一个日期,一个数据,如下所示:

我遇到的问题是从日期 12.02.2019 到 13.02.2019(左侧以红色标记)的过渡。 由于某种原因,JMP 将以 dd.mm.yyyy 格式读取从开始到最后 12.02.2019 值的日期值,但随后在 13.02.2019 切换为以 mm.dd.yyyy 格式读取日期。 当我进入 Excel 文件并检查单元格的格式时,它们是相同的。 我不明白为什么JMP突然切换。 当进行此切换时,JMP 表中的日期单元格将保留为空。
如果我将数据导入两个不同的块中,即从开始到最后一个 dd.mm.yyyy 格式的数据,以及其他块的第二个数据块,它会正确读取每个日期,但是两个不同日期的列信息的格式不同并且彼此不相容。 如果我尝试连接两个子集,它只会切换我连接到的表的日/月。
我还尝试更改 JMP 首选项中的多个切换选项以尝试强制系统或 JMP 设置,但均不成功。
如果我可以将日期作为字符导入,我可以相应地修改内容,然后将其切换回连续数据类型,那么一切都应该没问题。 唯一的问题是我不确定如何强制执行此操作,或者这是否是最好的方法。
与大多数自动化尝试一样,我强烈不想进入并编辑每个 Excel 工作表或文件。 我想让 JMP 通过 JSL 脚本执行此操作。
我用来导入的 JSL 代码是:
Open(
"file_location\file.xlsx",
Worksheets( "Sheet 1" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 2 ),
Data Starts on Column( 15 ),
Data Ends on Row( 0 ),
Data Ends on Column( 16 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
)
它与“限制列检测(0)”选项有关吗? 我找不到任何有关此内容及其用途的文档。
这个问题与 发布的问题类似@ghartel早在2017年5月( https://community.jmp.com/t5/Discussions/Excel-Import-Date-Format/td-p/16619 ),至少据我所知,他们没有直接解决他们的具体问题。
任何帮助深表感谢!
谢谢,
DS
回复:强制导入Excel日期列的格式我使用的是 Excel 365 build 1908,这是一个相当新的版本。您使用什么版本的 JMP?
布莱恩
回复:强制导入Excel日期列的格式我尝试了很多不同的方法来尝试使这项工作正常进行,包括您发送的内容,并且导入将显示数字,但没有实际值......
Excel 值:2019 年 11 月 26 日 9:41:04。 191下午
导入 JMP:2019 年 11 月 26 日 9:41:04。 000下午
是否有一个导入设置可能会改变我尚未打开的设置或类似的设置?
我在处理此问题时确实注意到 Excel 中的一个错误,我很好奇您是否也发生了同样的事情。 当 Excel 中的格式为 dd/mm/yyyy hh:mm:ss.000 时,值 0.191 显示在单元格中,但不会显示在顶部的公式栏中。 当我单击公式栏时,数字不再显示在公式或单元格中。 然后,当我单击公式栏外时,所有数字都会更改为 .000...... 我很好奇这是否会影响从 Excel 获取数据的方式。
我不知道这是否只是 Excel 的一个错误,或者可能是我拥有的版本(Excel 2013)。当该脚本适合您时,您使用的是哪个版本的 Excel?
回复:强制导入Excel日期列的格式您可以尝试使用“限制列检测”选项以及自定义格式。您可能需要 JMP 15 才能实现此功能。以下对我有用:
Open(
"C:\Users\sasbxc\Desktop\test.xlsx",
Worksheets( "Sheet1" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 2 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 1 ),
Column Separator String( "-" ),
Column Numeric Format(
Index( 0 ),
Column Name( Col1 ),
Format( "d/m/y h:m:s", 26, 3 )
)
)
)
布莱恩
回复:强制导入Excel日期列的格式太好了! 谢谢!
导入时我应该使用什么脚本格式将其读取为字符串?
回复:强制导入Excel日期列的格式我过去看到解决此类问题的方法是将列作为字符串读取,然后将过程发布到日期值中。
回复:强制导入Excel日期列的格式感谢您如此快速的回复!
问题实际上是在导入过程中(我认为),因此作为后期处理运行对我来说不起作用。
所以第一列中的 Excel 数据看起来格式如下:
26/11/2019 09:41:04.190 下午
当我将其导入 JMP 时使用打开(文件路径,工作表()….)数据格式如下:
26/11/2019 9:41:04 下午
如果我在导入后更改格式,结果是这样的:
2019 年 11 月 26 日 9:41:04.000 下午
所以看起来最后三位数字在导入过程中被删除了。 有没有办法在导入 JMP 表时强制采用该格式?
回复:强制导入Excel日期列的格式假设下载的数据是毫秒级的,那么只要导入数据表后改变格式即可。此示例的另一个假设是具有日期和时间值的列称为 DateTime,可以应用以下 JSL 来更改数据显示。
:DateTime << set format( "d/m/y h:m:s", 27, 3 );
回复:强制导入Excel日期列的格式嗨布莱恩,
我正在尝试导入 Excel 数据并努力以我想要的格式获取它。 我注意到您说 JMP 15 具有额外的导入格式化功能。 由于我使用的是 JMP15,我希望你能在这方面帮助我。
Excel 中的时间数据(第一列)附加了毫秒,因此我需要强制导入来识别这一点。 导入时,JMP 仅给出格式("d/m/yh:m:s",27,0)。 我需要将其设置为格式(“d/m/yh:m:s”,27,3)。 如果这是我的代码,那么小数点到 3 的格式在哪里?
Open(
"file_location\file.xlsx",
Worksheets( "Sheet 1" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 2 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
);
回复:强制导入Excel日期列的格式你好@gzmorgan0 ,
我终于回来并能够测试您使用 VB 保存为 txt 的 JSL 脚本。 它有效,我可以根据需要导入信息,我唯一的问题是它只对 Excel 文件中的最后一个选项卡执行此操作。
我的 Excel 文件有多个需要导入的选项卡,所有选项卡都存在日期问题。 进入 JMP 后,我将所有数据连接到一个数据表中进行分析。 我还发现我需要修改 JSL 来打开多个 Excel 文件,然后将所有数据放在一起。 增加了复杂性。
不幸的是,我对 VB 不太熟悉,无法编写处理多个选项卡的东西。 我有一个同事,他们正在研究这个问题。
我尝试更改 JMP 中的首选项以查看是否可以解决问题,但没有解决。 似乎确实存在一个错误,即使我将操作系统日期格式设置为德国 (dmy),它仍然使用安装操作系统(英语)并将日期读取为 mdy,因此它只会忽略任何大于 12 的日期。
JSL 脚本非常有帮助,感谢您发布它。 我们只需要修改 VB 部分来处理多个选项卡,仅此而已。
回复:强制导入Excel日期列的格式谢谢@gzmorgan0 ,特别是对于示例导入文件。 我将在下周对其进行测试,看看它是否有效,但无法很快实现。
期待 JMP 15 中的新“强制”选项。
谢谢!,
DS
回复:强制导入Excel日期列的格式@ghartel , 注意@briancorcoran提到 JMP 15 中可能有更多选项。
随附的脚本可将 Excel 工作表另存为制表符分隔的文本文件,然后将该文本文件读入 JMP。
您可能想要尝试使用系统默认值(在澳大利亚和德国)读取文本文件,以查看 JMP 导入文本默认值是否会将日期读取为文本。 如果没有,那么您必须命名所有列并指定数据类型。
由于此脚本使用 VBScript,因此它可能不适用于 Mac。
该脚本是作为“以防万一这可能有帮助”而提供的。
回复:强制导入Excel日期列的格式嗨 JMP 们,
澳大利亚也使用“不正确”的日期格式:(因此天被解释为月,并且 >12 由于格式违规而成为缺失值。 这可能发生在第二行。这是非常令人沮丧的,因为如果你不幸运,第一天 > 12 可能会发生在你没有注意到的文件中,并且最终会得到一个缺失值没有警告因为 JMP 认为它读取了不正确的日期格式。
有两件事可能使它发挥作用。首先,在“Windows 特定”下的 JMP 首选项中取消选中“使用 JMP 语言而不是系统区域设置...”框。我在 JMP 中找不到任何可以设置默认日期格式的地方 - 所以不确定这个标志指的是什么。第二步是更改 Windows 区域设置,如上一张海报所示,但是 JMP 不喜欢 dd/mm/YYYY 设置 - 它必须是 dd/MM/yy - 不知道为什么,但它至少可以工作为我。不知道这是否只是 Windows 的问题,即 Mac 是否没有这个问题。我在 Windows 7 计算机和 Windows 10 计算机上运行 JMP - JMP PRO 14.3 64 位,但我遇到了这个问题,因为 Excel 导入是 JMP 中的一个功能。
一些人建议以文本形式读取列 - 我看不到任何强制 JMP 以文本形式读取特定列的选项 - 这可能吗?
另一种解决方法是以 CSV 格式获取数据,因为某些原因 JMP 允许对输入进行非常精细的控制,这与 Excel 不同。第三种选择是使用数据库接口读取 Excel 文件。但这需要在您的 PC 上进行适当的 ODBC 设置,这也有点麻烦。
JMP 请注意 - 如果由于格式错误而无法导入字段,JMP 会发送一些警告或错误消息,那就太好了。我有一些客户在数字字段中添加 * 或 <,Excel 很乐意将其转换为字符字段,而 JMP 则很乐意且默默地转换为缺失值。JSL 非常适合自动化任务,但这种情况使得程序的防错变得非常困难。
干杯
冈特
回复:强制导入Excel日期列的格式@SDF1 ,我有两个建议:
- JSL 通过 Run Program() 可以运行其他程序,例如 VBSript。您的 JSL 可以写入通过 Excel 打开文件,将列格式设置为文本(如果需要);将文件另存为制表符分隔的文本;关闭 Excel,然后读入文本文件,您可以选择将列读取为文本,然后进行转换。
- Excel 文件可以用作数据库。 我做了一些阅读,你的德国同事看到的问题可能是由于数据类型的 Excel 转换器造成的。下面是使用 Open Database() 的 JSL。 这需要一些准备工作。 您的德国同事需要为 Excel 定义 DSN 并使用相同的名称。现在,如果每个人都有 64 位 JMP 和 64 位 MW Office,那就很容易了。 如果他们有 32 位 MS Office,我可以发送设置步骤。代码 IMEX=1 告诉 Excel 如果它看到看起来像 Excel 混合数据类型的列,请将其转换为文本。
dt2 = Open Database( "DSN=Excel Files;
DBQ=c:/temp/ExcelDateBlog.xlsx;IMEX=1",
"SELECT * FROM [Sheet1$]",
"Result from XLS"
);
我认为在 JMP 15 之前使用文本文件会更容易,此时 Excel 向导允许指定列格式。 如果您需要选项 #1 的帮助/示例,请告诉我。
回复:强制导入Excel日期列的格式你好@briancorcoran ,
抱歉,我总是忘记将我的系统详细信息放在新帖子的开头。
W7 企业版,64 位
JMP Pro 14.1.0(和 JMP 14.0.0)
我正在运行英语(美国)操作系统,并尝试为也运行 W7 Enterprise 的德国同事编写一些自动化代码,但将操作系统设置为德语。 对于像这样的其他项目,我没有遇到任何日期被误读的问题。 不过,我确实必须编写两种不同版本的代码,一种为我的美国同事,另一种为我的德国同事,因为普通的美国操作系统将日期作为文本读取。 并作为@gzmorgan0已经提到,当它作为文本读入时,处理和转换它是没有问题的。 但是,如果我的德国同事尝试运行为在美国计算机上运行而编写的 JSL 脚本,则效果不佳,因此我必须更改代码才能在德语操作系统上正确运行。
为了编写在德国计算机上运行的代码,我将操作系统中的区域/本地设置更改为“德语(德国)”。 不幸的是,JMP 似乎无法从我拥有的 Excel 文件中正确导入日期设置。
回复:强制导入Excel日期列的格式谢谢格鲁吉亚。 我已将其作为可能的错误发送出去进行调查。
布莱恩
回复:强制导入Excel日期列的格式@SDF1 ,抱歉,它不适合你。
JMP 并非来自德国,因此将 dd.mm.yyyy 格式解释为文本。
您可以尝试以下建议之一:
- 将该日期列设置为文本列。
- 将数据保存为文本文件,其中导入预览或脚本允许您设置格式并强制其为字符。
我确实认为存在内部错误。 请参阅我给布莱恩的上一篇文章。
回复:强制导入Excel日期列的格式@briancorcoran ,你看到我的依靠了吗@SDF1 ?
- 我在 Excel 工作表中以文本/字符形式读取
- 然后发了专栏消息
dt:Date << Data Type (Numeric,
"Continuous",
Format( "m/d/y", 12 ),
Input Format( "ddmmyyyy" ));
- 描述的相同行为@SDF1也发生了。我在 2019 年 2 月 13 日读取了第一个数据,后来这些值是空的。 这与 Excel 工作表无关:JMP 将日期列读取为文本。
- 但是,如果我使用下面的列消息,其中没有 2 次转换,输入格式和格式相同,则数据会正确转换。
dt:Date << Data Type (Numeric,
"Continuous",
Format( "ddmmyyyy", 12 ),
Input Format( "ddmmyyyy" ));
- 然后使用上一列 Data Type() 消息,选择的格式就可以了。
正如我在回复中所述,这是非常意外的行为,对我来说似乎是一个错误。 我使用的是 JMP Pro 14.3
回复:强制导入Excel日期列的格式您使用什么版本的 JMP?
布莱恩
回复:强制导入Excel日期列的格式嗨布莱恩( @briancorcoran ),
是的,事实上该列设置为“日期”,采用德国风格的 dmy 格式。 请查看该线程中的上一篇文章,其中包含 Excel 列属性窗口和设置的屏幕截图。 就连我的系统设置也是这样,见下文。
谢谢!,
DS

回复:强制导入Excel日期列的格式嗨,DS,
JMP 应遵循专门应用于 Excel 中的列的格式。您是否已进入 Excel 并使用“设置单元格格式”对话框将列类型显式设置为“日期”,然后设置为欧洲格式(例如德国 dmy)?在这种情况下,JMP 应正确输入数据。
布莱恩
回复:强制导入Excel日期列的格式更新:
我对 Excel 文件做了一些深入研究,当我尝试导入数据时,所有选项卡中导致此错误的一个常见问题是它读取日期列并从日期 12.02.2019(2019 年 2 月 12 日)开始)至2019年2月13日(2019年2月13日)。
我的理论是这样的:我认为 JMP 混淆了 12 号之前到之后的日期格式。 我的原始日期范围是2019年1月2日至2019年2月28日:2019年1月2日至2019年2月28日。
当 JMP 向下读取日期列时,它实际上似乎将日期 02.01.2019 解释为 2019 年 2 月 1 日,因此当它到达 12.02.2019 时,它实际上将日期读取为 2019 年 12 月 2 日。 因此,当到达 13.02.2019(2019 年 2 月 13 日)时,它不知道如何读取日期,因为没有第 13 个月。 JMP 中的列属性始终将其显示为“连续”建模类型、“dmy”格式和“dmy”输入格式。 除非我将导入分成两部分,否则它会执行此操作。
如果我将导入分为两个不同的部分,一个是从 2019 年 1 月 2 日到 2019 年 2 月 12 日,然后是从 2019 年 2 月 13 日到 2019 年 2 月 28 日,JMP 会相应地导入数据并相应地分配列格式。 然后我可以将两者连接成正确的数据表。 我不知道为什么它在我原来的帖子中不起作用,但它可以这样工作。
我还可以确认数据的正确导入并不依赖于我在 JMP 中设置的首选项。
这不太有利于自动化,因为原始文件可能会更改第 12/13 日期更改的位置(行)。 不过,我想我可能必须通过分割路线使其工作。 如果这是 JMP 中的错误,那么如果能够修复该错误就太好了。
回复:强制导入Excel日期列的格式你好@gzmorgan0 ,
感谢您的想法和意见。 不幸的是,这种方法也行不通。 该问题源于 JMP 在导入日期格式之前误读了日期格式。 如果我运行脚本或尝试通过向导 GUI 执行此操作,JMP 会将日期错误分类为 dmy 或 mdy 格式(而实际上是另一种格式)。
即使针对日期格式的不同变化修改代码也不能解决问题。 它只是不导入混合格式,只将其中一种视为连续格式,其他格式将被忽略。 JSL 代码也不会将其作为标称数据类型导入——它直接作为连续数据类型导入。
谢谢!,
DS
回复:强制导入Excel日期列的格式你好@briancorcoran ,
感谢您的意见。 我尝试了你的建议,但不幸的是,它没有奏效。 即使在预览窗格中“限制列检测”并显示所有行时,JMP 也会在读取格式时出现问题。 它可以很好地读取前 205 行,但在第 206 行,由于某种原因它会切换格式。
没有意义的是,Excel 中的格式从一行到下一行并没有改变。 如果确实如此,我就能理解为什么 JMP 可能会以不同的方式读取它们。 在 Excel 中,所有单元格的格式均为“日期”dd.mm.yyyy。 同样的事情发生在我导入的下一个选项卡上,但在第 52 行到第 53 行。 我可以理解原始 Excel 文件生成中是否存在问题,即所有表中的相同行存在一些以不同方式保存日期的故障,但当 JMP 读入数据时,它甚至不在选项卡之间的同一位置。
我看到的 Excel 方面唯一的格式设置可能是“日期”类别中的“类型”选项以 * 开头,请参见下面的附图。 但是,这应该根据操作系统设置进行更新。 该列中的所有日期均采用这种方式格式化,因此如果 JMP 对其中一个日期有问题,那么所有日期都应该有问题。
我会尝试@gzmorgan0的导入建议,看看是否有效。
如果 JMP 在导入过程中强制执行某些格式设置类型,那就太好了,尤其是在构建用于自动化流程的 JSL 代码时。

回复:强制导入Excel日期列的格式出于性能原因,Excel 预览会查看前 100 行以确定预览的数据类型。在实际导入操作期间,JMP 会查看所有行。如果它在第 100 行之后看到导致不同结论的数据,则可能会产生不同的结果。如果您希望预览查看所有行以生成导入时将看到的内容,则可以在 UI 的预览窗格刷新中选择“显示所有行”选项。如果您希望导入在读取数据时仅查看前 100 行,以产生预览的行为,您可以转到导入对话框第二个窗格中的“高级选项”,然后选择“限制列类型检测” 。
JMP 15 将引入将各个列的数字格式类型强制为用户选择的功能。
布赖恩·科科伦
JMP开发
回复:强制导入Excel日期列的格式嗯嗯, @SDF1 ,您可能发现了一个错误。
我采取的方法是读入数据,让它成为一个字符串,然后将其转换。 但是,如果我尝试仅使用最后一个 Data Type() 消息,我会看到与您描述的相同的行为。 如果我保留相同的信息和格式声明,则不会出现问题。转换后,然后设置为您选择的格式
Names default to here(1);
dt = Open(
"C:\temp\ExcelDateBlog.xlsx",
Worksheets( "Sheet1" ),
Use for all sheets( 0 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 2 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
);
wait(0); //change to 2 seconds to see that the data is read in as text
dt:Date << Data Type (Numeric,
"Continuous",
Format( "ddmmyyyy", 12 ),
Input Format( "ddmmyyyy" ));
dt:Date << Data Type (Numeric,
"Continuous",
Format( "m/d/y", 12 ),
Input Format( "ddmmyyyy" ));
霍普有帮助。