軸に時間を表示したい(SetTimeDisplay / SetTimeFormat / SetTimeOffset

 1#include <TStyle.h>
 2#include <TGraph.h>
 3
 4TGraph *graph = new TGraph();
 5// ...データをFill...
 6
 7// Unix epoch と ROOT epoch の差を設定
 8gStyle->SetTimeOffset(-788918400);
 9
10// グラフのX軸を時間表示に設定
11graph->GetXaxis()->SetTimeDisplay(1);
12
13// 時間のフォーマットを指定
14graph->GetXaxis()->SetTimeFormat("%Y-%m-%d %H:%M:%S");
15
16// タイムゾーンを GMT+0 に設定
17graph->GetXaxis()->SetTimeOffset(0, "gmt");

SetTimeDisplaySetTimeFormatSetTimeOffsetメソッドで、 グラフやヒストグラムの軸に時間情報を表示できます。

 1from ROOT import gStyle, TGraph
 2
 3graph = TGraph()
 4# ...データを充填...
 5
 6# Unix epoch と ROOT epoch の差を設定
 7gStyle.SetTimeOffset(-788918400)
 8
 9# グラフのX軸を時間表示に設定
10graph.GetXaxis().SetTimeDisplay(1)
11
12# 時間のフォーマットを指定
13graph.GetXaxis().SetTimeFormat("%Y-%m-%d %H:%M:%S")
14
15# タイムゾーンを GMT+0 に設定
16graph.GetXaxis().SetTimeOffset(0, "gmt")

Epoch時間を理解したい

Epoch時間とは、特定の基準時点から経過した秒数で時刻を表す方式です。

Unix Epoch と ROOT Epoch の違い

Unix Epoch

  • 基準時点: 1970年1月1日00時00分00秒(UTC)

  • コンピューターの標準時間形式として広く使われている

  • Linux、Unix、Windows、macOSなど多くのOSで採用

ROOT Epoch

  • 基準時点: 1995年1月1日00時00分00秒(UTC)

  • ROOT固有の時間形式

  • 1995年から2038年までの期間に対応

Epoch時間の計算

1970年から1995年までの時間差を計算します:

 1# 1970年から1995年までは25年間
 2years = 1995 - 1970  # 25 years
 3
 4# 25年間に含まれる日数
 5# 通常の年:365日、閏年:366日
 6days_per_year = 365
 7leap_years = 6  # 1972, 1976, 1980, 1984, 1988, 1992
 8
 9# 総日数
10total_days = years * days_per_year + leap_years  # 9131 days
11
12# 秒数に変換
13seconds_per_day = 24 * 60 * 60  # 86400 seconds
14epoch_difference = total_days * seconds_per_day  # 788918400 seconds
15
16# ROOT では負の値を使用(UnixのepochがROOTのepochより前)
17root_offset = -788918400

時間表示の設定をしたい

基本的な時間表示設定

 1#include <TStyle.h>
 2#include <TGraph.h>
 3
 4TGraph *graph = new TGraph();
 5// ...データを充填...
 6
 7// グローバル設定:Unix epoch と ROOT epoch の差
 8gStyle->SetTimeOffset(-788918400);
 9
10// グラフ個別設定:時間表示を有効化
11graph->GetXaxis()->SetTimeDisplay(1);
12
13// グラフ個別設定:タイムゾーンを GMT+0 に設定
14graph->GetXaxis()->SetTimeOffset(0, "gmt");

時間フォーマットの指定

 1#include <TStyle.h>
 2#include <TGraph.h>
 3
 4TGraph *graph = new TGraph();
 5// ...データを充填...
 6
 7// ISO 8601形式:年-月-日T時:分:秒
 8graph->GetXaxis()->SetTimeFormat("%Y-%m-%dT%H:%M:%S");
 9
10// または別の形式:年/月/日 時:分:秒
11graph->GetXaxis()->SetTimeFormat("%Y/%m/%d %H:%M:%S");

異なる時間フォーマットを使いたい

ISO 8601形式(推奨)

1#include <TStyle.h>
2
3graph->GetXaxis()->SetTimeFormat("%Y-%m-%dT%H:%M:%S");
  • %Y - 4桁の年(例:2025)

  • %m - 2桁の月(01-12)

  • %d - 2桁の日(01-31)

  • %H - 2桁の時間(00-23)

  • %M - 2桁の分(00-59)

  • %S - 2桁の秒(00-59)

月日と時刻を2段に表示

1#include <TStyle.h>
2
3// 長時間測定の場合、月日と時刻を分ける
4graph->GetXaxis()->SetTimeFormat("#splitline{%m-%d}{%H:%M}");

複数日にわたるデータでは、日付と時刻を分けて表示すると見やすくなります。

日付のみを表示

1#include <TStyle.h>
2
3graph->GetXaxis()->SetTimeFormat("%Y-%m-%d");

長期間のデータで、時間の詳細が不要な場合に使用します。

時刻のみを表示

1#include <TStyle.h>
2
3graph->GetXaxis()->SetTimeFormat("%H:%M:%S");

短時間の測定データで、日付の詳細が不要な場合に使用します。

タイムゾーンを設定したい

1#include <TStyle.h>
2
3// GMT+0(世界標準時)
4graph->GetXaxis()->SetTimeOffset(0, "gmt");
5
6// ローカルタイム
7graph->GetXaxis()->SetTimeOffset(0, "local");

タイムゾーンの設定がないと、軸の時間がずれることがあります。 通常は "gmt" を使用して、世界標準時に統一することが推奨されます。

実用例

短時間測定データ(時刻のみ)

 1#include <TStyle.h>
 2#include <TGraph.h>
 3
 4gStyle->SetTimeOffset(-788918400);
 5
 6TGraph *graph = new TGraph();
 7// ...データを充填...
 8
 9graph->GetXaxis()->SetTimeDisplay(1);
10graph->GetXaxis()->SetTimeFormat("%H:%M:%S");
11graph->GetXaxis()->SetTimeOffset(0, "gmt");

1時間以内の測定では、時刻だけで十分です。

1日間の測定データ(時刻と時間帯)

 1#include <TStyle.h>
 2#include <TGraph.h>
 3
 4gStyle->SetTimeOffset(-788918400);
 5
 6TGraph *graph = new TGraph();
 7// ...データを充填...
 8
 9graph->GetXaxis()->SetTimeDisplay(1);
10graph->GetXaxis()->SetTimeFormat("%H:%M");
11graph->GetXaxis()->SetTimeOffset(0, "gmt");

日中の測定では、時間と分で十分な場合が多いです。

複数日の測定データ(日付と時刻を2段に)

 1#include <TStyle.h>
 2#include <TGraph.h>
 3
 4gStyle->SetTimeOffset(-788918400);
 5
 6TGraph *graph = new TGraph();
 7// ...データを充填...
 8
 9graph->GetXaxis()->SetTimeDisplay(1);
10graph->GetXaxis()->SetTimeFormat("#splitline{%m-%d}{%H:%M}");
11graph->GetXaxis()->SetTimeOffset(0, "gmt");

複数日にわたるデータでは、月日と時刻を分けて表示すると見やすくなります。

長期観測データ(日付のみ)

 1#include <TStyle.h>
 2#include <TGraph.h>
 3
 4gStyle->SetTimeOffset(-788918400);
 5
 6TGraph *graph = new TGraph();
 7// ...データを充填...
 8
 9graph->GetXaxis()->SetTimeDisplay(1);
10graph->GetXaxis()->SetTimeFormat("%Y-%m-%d");
11graph->GetXaxis()->SetTimeOffset(0, "gmt");

数ヶ月以上の観測データでは、日付のみで十分です。

時間データの準備

Unixtimestampを ROOTの時間形式に変換する場合:

 1#include <ctime>
 2#include <TGraph.h>
 3#include <TStyle.h>
 4
 5// Unix timestamp (秒単位)
 6time_t unix_time = std::time(nullptr);
 7
 8// ROOT epoch への変換
 9double root_time = unix_time + 788918400;
10
11// グラフに設定
12gStyle->SetTimeOffset(-788918400);
13TGraph *graph = new TGraph();
14graph->SetPoint(0, root_time, value);
15
16graph->GetXaxis()->SetTimeDisplay(1);
17graph->GetXaxis()->SetTimeFormat("%Y-%m-%d %H:%M:%S");

注意事項

  • タイムゾーン設定: タイムゾーンを指定しないと、軸の時間がずれます。通常は "gmt" を使用します

  • データの時間形式: あらかじめデータを ROOT epoch に変換しておく必要があります

  • フォーマット文字列: strftime 関数の標準フォーマットに準じています

  • #splitlineの使用: 2行表示が必要な場合は #splitline{上段}{下段} の構文を使用します

リファレンス