日付と時間データのフィットDate-and-Time-Data
日付や時刻の情報を表示するために使われる、さまざまな文字列フォーマットは、情報をユーザに通知するのに役立ちますが、これらの値をプロットしたり分析するには、これらの値の数学的基礎が必要です。
Originは、天文学的なユリウス暦を改訂して日付と時刻を保存しています。
これは、時刻0は、BC4713/01/01の正午12:00です。
数字の整数部分は時刻0からの日数を表し、小数部分は24時間表示での分数を表します。
Originは、正午ではなく、夜中の0:00を表すように、12時間(0.50日)減算してこの値を使っています。
次のいくつかのサンプルでは、LabTalkスクリプトで日付と時刻のデータを扱う方法を示しています。
Note: 日付 または 時刻 で表されるテキストは、実際には、Originで数値として扱われない文字 または 文字と数値 の形式です。
列プロパティダイアログ(列名をダブルクリックするか列を選択し、「フォーマット:列フォーマット」)を使用して、テキストまたは文字と数値列を、日付か時間フォーマットに変換します。
表示フォーマットは、変換時に列のテキストフォーマットに一致する必要があります。
日付と時刻
例として、アクティブシートの列1に日付データ、列に時刻データがあるものとします。そして、日付と時刻を1つの列に保存するものとします。
/* 日付と時刻の両方は数学的基礎で成り立っているので加算可*/
Col(3) = Col(1) + Col(2);
// デフォルトで、新しい列は日数を表示
/* フォーマットとサブフォーマット法を使って選択した日付と時間の表示をセット*/
// Format #4 は日付フォーマット
wks.col3.format = 4;
// サブフォーマット #11 は MM/dd/yyyy hh:mm:ss
wks.col3.subformat = 11;
上記の列番号は、format ステートメントにハードコーディングされています。列数をcnという変数に持っている場合、wks.col$(cn).format = 4.のようにして、数字の3を$(cn)で置き換えることができます。 他の format および subformat オプションに対しては、LabTalk言語リファレンス: オブジェクトリファレンス: Wks.col (オブジェクト)をご覧下さい。
日付と時刻の列は、列1でMM/dd/yyyy のフォーマット、列2で hh:mm:ss のフォーマットを持つテキストの場合、同じ操作がいくつかのコード行で可能です。
// ループする行数を取得
int nn = wks.col1.nrows;
loop(ii,1,nn){
string dd$ = Col(1)[ii]$;
string tt$ = Col(2)[ii]$;
// 日付と時間の文字列をテキストとして保存
Col(3)[ii]$ = dd$ + " " + tt$;
// 日付関数は日付と時間の文字列を数値の日付値に変換
Col(4)[ii] = date(%(dd$) %(tt$));
};
// 列4を真の日付列に変換
wks.col4.format = 4; // 日付列に変換
wks.col4.subformat = 11; // M/d/yyyy hh:mm:ssとして表示
ここで、中間的な列は、文字列として日付と時刻の組合せを保持するように形式化され、結果の日付と時刻(数値)の値は4番目の列に保存されます。
これらは同じテキストになるよう現れますが、列Cは文字通りのテキストで、列Dは日付です。
この数学的な方法によって、2つの日付の差(2つの日付の日数、時間) を計算し、その結果を時間列に入れることができます。そして、時刻を日付に加え、新しい日付の値を計算できます。また、時刻データを時刻データに追加して、有効な時刻データを取得することができますが、日付データを日付データに加えることはできません。
出力用のフォーマット
利用可能な形式
D表記を使って、Originの組込の日付フォーマットの1つを使って、数値の日付の値 を文字列の日付時刻に変更することができます。
type "$(@D, D10)";
これは、現在の日付と時間(システム変数 @Dに保存) を読み込み可能な文字列として返します。
7/20/2009 10:30:48
D10 オプションは、MM/dd/yyyy hh:mm:ss に対応しています。上記スクリプトのD文字の後の数値を変更することで、多くの他の出力フォーマットが利用できます。これはワークシート列フォーマットダイアログの日付フォーマットドロップダウンリストの選択肢のインデックス(0から)です。最初の項目(インデックス = 0)は、Windowsの短縮形式の日付で、2番目はWindowsの長い形式の日付です。
Note: D は大文字でなければなりません。wks.col3.subformat = #, のようなワークシートのサブフォーマットを設定する場合、これらのインデックス値は1から始まります。
例えば
type "$(date(7/20/2009), D1)";
は、日本の地域の設定では以下のようになります。
09/07/20, 月曜日となります。
同様に、時刻の値の出力フォーマットに対して、類似のT表記があります。
type "$(time(12:04:14), T5)"; // ANS:12:04 PM
このように日付と時刻をフォーマットすることは、一般的な $() 置換 表記の特殊な形式を使います。
カスタムフォーマット
3つのカスタム日付と時刻のフォーマットがあります。そのうち2つはスクリプト編集可能なプロパティで、もう1つは列のプロパティダイアログで編集するか、ワークシート列オブジェクトメソッドで編集します。
- system.date.customformatn$
- wks.col.SetFormat オブジェクトメソッド
両方のメソッドは、カスタムフォーマットを示すために、 yyyy'.'MM'.'dd のような日付と時刻の指定子を使います。 以下に注意して下さい。
- 日付時刻指定子のテキストの一部 (非スペースの区切り)は、必要に応じて変更できますが、引用符で囲む必要があります。
- 指定子のトークン自体 (i.e., yyyy, HH, etc.)は、大文字小文字を区別し、表示通りに使う必要があります。— 利用可能なすべての指定子のトークンは、リファレンステーブル: 日付と時刻フォーマットの指定子にあります。日付と時間フォーマットの指定子
- 最初の2つのフォーマットは、ローカルなファイルにその説明を保存し、他のログインアカウントで別の表示することができます。3番目のフォーマットには列自体の説明が保存されます。
Dnn 表記
Originは、これらのカスタム日付の表示に対して、D19 から D21 を予約しています(Dの後の整数値は0から数えるので、サブフォーマット20から22)。 オプションのD19とD20は、それぞれシステム変数 system.date.customformat1$ と system.date.customformat2$ で制御されます。 このオプションを使うには、以下のサンプルをご覧下さい。
system.date.customformat1$ = MMM dd hh'.'mm tt;
type "$(Date(7/25/09 14:47:21),D19)"; // 出力Jul 25 02.47 PM
system.date.customformat2$ = yy','MM','dd H'.'mm'.'ss'.'####;
type "$(Date(7/27/09 8:22:37.75234),D20)"; // 出力: 09,07,27 8.22.37.7523
Wks.col.SetFormat オブジェクトメソッド
ワークシート列に保存されている日付列のカスタム日付表示を指定するには、 Wks.Col.SetFormat オブジェクトメソッドを使います。 カスタム日付フォーマット指定子を入力するとき、非日付文字を引用符で囲んで下さい。 このオブジェクトメソッドは、アクティブワークシートの列に対してのみ動作します。
次のサンプルでは、アクティブワークシートの列4は、カスタム日付/時刻フォーマットを表示するようセットされています。
// wks.format=4 (日付), wks.subformat=22 (カスタム)
wks.col4.SetFormat(4, 22, yyyy'-'MM'-'dd HH':'mm':'ss'.'###);
doc -uw; // リフレッシュして変更を表示
|