在JMP中,您可能需要处理四种常见的基于时间的值:日期、时间、日期时间和持续时间。无论您是从数据库还是平面文件导入数据,无论您是在 JSL 中引用它们还是在 JMP 的轴上使用它们,了解 JMP 如何存储这些值以及使用它们的含义都至关重要。
日期时间值
日期时间值表示特定日期的特定时间,例如:
- 2016年1月20日中午12点
- 1918年11月7日下午3:00
- 1969年7月20日20:17
与大多数分析应用程序一样,JMP 将日期时间值存储为自参考时间以来的时间单位数。在 JMP 中,参考时间为 1904 年 1 月 1 日凌晨 12:00,单位为秒。更通俗地说:JMP 将日期存储为自 1904 年 1 月 1 日午夜以来的秒数。
因此,上面示例中与日期时间值相对应的数值是:
| 日期时间 |
JMP 日期时间值 (自 1904 年 1 月 1 日午夜以来的秒数) |
| 2018年1月20日中午12点 |
3536136000 |
| 1918年11月7日下午3:00 |
468687600 |
| 1969年7月20日20:17 |
2068661820 |
日期
在 JMP 中,日期值只是日期时间的一个特例,因为它们假设时间为凌晨 12:00。因此,它们只是计算从 1904 年 1 月 1 日午夜到存储日期午夜的秒数。
时代
时间值表示一天中没有具体日期的时间。JMP 将时间值存储为从午夜开始的当天秒数。因此,凌晨 12:01:01 为 61。即从午夜开始经过 61 秒。
持续时间
时长其实并没有什么特别之处,只不过它们是表示某个时间单位数量的数字。毫不奇怪,JMP 在处理以秒为单位的时长时效果最佳。我们将在讨论格式化基于时间的值以进行显示时详细讨论这一点。
格式化基于时间的值以供显示
将基于时间的值显示为秒数并不是特别有用,因此 JMP 有许多日期格式和时间格式来显示这些值。
但请记住,更改日期的显示方式并不会改变其基础值或分析方式。例如,将格式更改为“m/y”(即月/年)并不会强制 JMP 在分析或绘制数据图表时按月汇总数据。如果您要按月汇总数据,则需要创建一个包含要汇总的唯一值的新列。要创建这些新列,请右键单击标题并选择“新建公式列” 来转换该列。
导入基于时间的值
导入数据时,务必确保基于时间的值存储为上述数值。大多数情况下,JMP 会在导入或复制/粘贴操作期间尝试识别基于时间的值,并自动执行此操作。您可以通过查看数据表中列中值的对齐方式来判断是否正确完成。数值右对齐,字符值左对齐。
Wrong is a character column. Notice it is left-justified. Right is numeric column. It is right-justified.Wrong is a character column. Notice it is left-justified. Right is numeric column. It is right-justified.Wrong is a character column. Notice it is left-justified. Right is numeric column. It is right-justified.Wrong is a character column. Notice it is left-justified. Right is numeric column. It is right-justified.Wrong is a character column. Notice it is left-justified. Right is numeric column. It is right-justified.错误是字符列。注意它是左对齐的。正确是数字列。它是右对齐的。
如果您发现某些基于时间的值以字符串形式存储,可以使用“列信息”对话框进行转换。只需将“数据类型”更改为数值,将“格式”更改为所需的日期/时间格式,并将“输入格式”更改为描述数据中字符串的格式即可。JMP 会将这些值转换为相应的数值。
First change the Data Type to Numeric.First change the Data Type to Numeric.First change the Data Type to Numeric.First change the Data Type to Numeric.First change the Data Type to Numeric.首先将数据类型更改为数字。
Pick the Format that you want to use to display the time-based value.Pick the Format that you want to use to display the time-based value.Pick the Format that you want to use to display the time-based value.Pick the Format that you want to use to display the time-based value.Pick the Format that you want to use to display the time-based value.选择您想要用来显示基于时间的值的格式。
Finally, change the Input format to match the format of the strings in the column.Finally, change the Input format to match the format of the strings in the column.Finally, change the Input format to match the format of the strings in the column.Finally, change the Input format to match the format of the strings in the column.Finally, change the Input format to match the format of the strings in the column.最后,更改输入格式以匹配列中字符串的格式。
解析 Date() 一个有用的函数
解析日期()函数(及其别名知情() )也适用于将字符串转换为数值。当不使用可选的第三个参数时,它将扫描输入字符串并尝试找到合适的输入格式。这使得它成为一个通用函数,无论输入格式如何。
使用基于时间的值进行计算(即数学)
将所有这些基于时间的值存储为数字意味着我们可以对它们进行数学运算来计算年龄、自某个事件以来的时间、转换为其他时间单位等。
例如,JMP 中两个日期、时间或日期时间值之间的差异将是两个值之间的秒数。
这意味着您需要将结果转换为更友好的单位,如分钟、天、周或年(提示: 以小时为单位() 、 以周为单位()和其他 In...() 函数可以在这里提供帮助。)
JMP 具有许多内置函数,可以更轻松地计算基于时间的值。
以下是我最喜欢的几个:
一天中的时间(日期时间)
此函数返回日期时间值的当前时间(即自午夜起的秒数)。这对于将日期时间值转换为日期值非常有用。您只需从日期时间值中减去 Time of Day() 即可:
datetime = Today();
date = datetime - Time Of Day( datetime );
Show( As Date( date ) );
日期差异(datetime1,datetime2,“interval_name”,<“alignment”>)
此函数返回两个日期时间值之间的差值。当然,您也可以直接用一个值减去另一个值,得到它们之间的秒数。但 Date Difference() 函数允许您使用“interval_name”参数指定返回差值的时间单位。例如:
datetime1 = 01Sep2018:03:00:01;
datetime2 = 04Sep2018:14:10:15;
Date Difference( datetime1, datetime2, "Hour" );
请务必查看日期时间函数的完整列表。它们使基于时间的值的处理变得更加容易。
JSL 中的日期和时间常量
在 JSL 中表示日期、日期时间和时间变量需要使用特定格式。日期必须使用 ddMONyyyy 格式,时间则必须使用 dd:hh:mm:ss 格式。例如:
time = 14:10:15;
date = 18Jan1957;
datetime = 11Jul2000:03:10:12;
感谢@Jeff_Perkinson对可用功能的精彩概述。
重新阅读这篇文章并将这些技巧应用到我们的日常工作流程中,其投资回报率非常高。
JMP 提供了许多用于数据导入、数据整理和日期数据分析的实用功能——而且它们在实践中确实发挥了重要作用!
除此之外,JMP 在某些方面还缺少一些功能或有待改进,并且有时会出现一些意想不到的行为。此外,还有一些 bug——或者至少是一些用户感觉像是 bug 的问题,例如“MDY”和“DMY”之间的区别,从 Unix/Python 导入时间戳的日期问题,以及“Z”或毫秒相关的问题。
如果您在日常工作中遇到日期和时间方面的问题,请查看该问题是否已列出 - 然后点击链接进行投票!
如果未列出,请在下方或直接在愿望清单中发布您的问题。
让我们来完善JMP。让它比地球更圆润。;)
特点/舒适度:
疑似bug:
以下是转换时的另一个实用技巧:
如上所述,日期转换的第一个问题是,JMP 在后台将日期“读取”为自1904 年 1 月 1 日 00:00:00 以来的秒数(而 Excel 则从 1900 年 1 月 1 日开始“读取”,这几乎是 40 亿秒,我们将在 2026 年 10 月 3 日 07:06:40 达到这个时间点)!这就是为什么在转换日期时,您有时会看到 39 亿左右的值。
其次,虽然您可以更改所查看时间的格式,但 JMP 仍然会以原始导入格式“读取”时间。例如,假设您有一个日期 2020 年 1 月 15 日,并且我想将所有 1 月份的日期以 MM/YYYY 格式分组(用于绘制图表或表格),仅仅将格式更改为 MM/YYYY 是行不通的——JMP 仍然会将其读取为原始导入日期格式。
也就是说,我目前为止最成功的日期转换方法是:
- 对于 MM/YYYY 格式的日期,我使用:Date DMY( 1, Month( :TRANSACTION_DATE ), Year( :TRANSACTION_DATE ) ),格式为 MM/YYYY。
- 对于从日期转换为 YYYYQq 格式,我使用: Date DMY( 1, Floor( (Month( :TRANSACTION_DATE ) - 1) / 3 ) * 3 + 1, 年份( :TRANSACTION_DATE ) ),格式为 YYYYQq(例如 2020Q1)。
这两种方法本质上都是将特定月份的所有日期分别放到该月或该季度的第一天。这看起来是一种奇怪的变通方法,但它确实能满足你对制表、时间序列、图表构建等功能的需求。