在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 月 10 月 06 日這就是為什麼在轉換日期時,您有時會看到 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 ) ),格式為 YYYYYQq(例如 20020Q1)。
這兩種方法本質上都是將特定月份的所有日期分別放到該月或該季度的第一天。這看起來是一種奇怪的變通方法,但它確實能滿足你對製表、時間序列、圖表建立等功能的需求。