Pythonとopenpyxlで時系列データを美しく可視化!DateAxisを使った日付軸設定入門

openpyxl

PythonのopenpyxlライブラリでExcelの時系列グラフを作成する際、「日付がうまく表示されない」「ただの数値になってしまう」といった問題でお困りではありませんか?

Excel上で手動でグラフを作れば簡単にできる日付軸の設定も、コードで実現しようとすると、少し特別な対応が必要になります。

この記事では、openpyxlのDateAxis機能に焦点を当て、時系列データの横軸(X軸)を思い通りの日付形式で表示する方法を、初心者にも分かりやすく解説します。サンプルコードを交えながら、基本的な設定から見やすいグラフに仕上げるためのカスタマイズ方法までを網羅的にご紹介します。

この記事を読み終える頃には、あなたもPythonを使って、美しく分かりやすい時系列グラフを自動で作成できるようになっているはずです。

はじめに:openpyxlでグラフを作成する準備

まずは、グラフを作成するための準備を整えましょう。ライブラリのインストールが済んでいない方は、ここから始めてください。

openpyxlのインストール

openpyxlはPythonのパッケージ管理ツールであるpipを使って簡単にインストールできます。ターミナルやコマンドプロンプトで以下のコマンドを実行してください。

pip install openpyxl

すでにインストール済みの方も、最新バージョンにアップデートしておくと安心です。

pip install --upgrade openpyxl

グラフ作成の基本的な流れ

openpyxlでグラフを作成する手順は、大まかに以下のようになります。

  1. WorkbookオブジェクトとWorksheetオブジェクトを作成する
  2. シートにグラフのもとになるデータを書き込む
  3. Chartオブジェクト(折れ線グラフ、棒グラフなど)を作成する
  4. Chartオブジェクトにデータ範囲や各種設定を行う
  5. WorksheetにChartオブジェクトを追加する
  6. WorkbookをExcelファイルとして保存する

今回はこの流れの中で、特に日付軸の設定 DateAxis に注目していきます。

よくある失敗例:なぜDateAxisが必要なのか?

DateAxisの重要性を理解するために、まずはそれを使わずに時系列グラフを作成してみましょう。多くの方がつまずくポイントを先に見ていきます。

日付データを用意する

サンプルとして、日付と日々の歩数を記録したデータを用意します。Pythonのdatetimeモジュールを使うと、日付データを簡単に扱うことができます。

import datetime
from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference

# サンプルデータを作成
data = [
    ["日付", "歩数"],
    [datetime.date(2023, 10, 1), 8500],
    [datetime.date(2023, 10, 2), 9200],
    [datetime.date(2023, 10, 3), 7800],
    [datetime.date(2023, 10, 4), 10500],
    [datetime.date(2023, 10, 5), 8800],
]

DateAxisなしでグラフを作成した場合の問題点

このデータをExcelシートに書き込み、ごく一般的な方法で折れ線グラフを作成してみます。

# --- 上記のコードからの続き ---

# 1. WorkbookとWorksheetを作成
wb = Workbook()
ws = wb.active
ws.title = "歩数記録"

# 2. シートにデータを書き込む
for row in data:
    ws.append(row)

# 3. 折れ線グラフオブジェクトを作成
chart = LineChart()
chart.title = "10月上旬の歩数"
chart.y_axis.title = "歩数"
chart.x_axis.title = "日付"

# 4. グラフのデータ範囲を設定
y_data = Reference(ws, min_col=2, min_row=1, max_row=6)
x_data = Reference(ws, min_col=1, min_row=2, max_row=6) # 日付の範囲
chart.add_data(y_data, titles_from_data=True)
chart.set_categories(x_data)

# 5. シートにグラフを追加
ws.add_chart(chart, "D2")

# 6. Excelファイルを保存
wb.save("without_date_axis.xlsx")

このコードを実行して生成されたwithout_date_axis.xlsxを開いてみると、グラフの横軸が日付ではなく、「45200, 45201, 45202…」のような大きな数値(Excelのシリアル値)になっているはずです。

これは、openpyxlがデフォルトでは横軸のデータを単なる数値として扱ってしまうためです。これでは時系列グラフとして全く意味を成しません。この問題を解決するのがDateAxisなのです。

DateAxisの基本:グラフの横軸を日付に設定する

ここからが本題です。DateAxisを使って、グラフの横軸を正しく日付として認識させる方法を学びましょう。

DateAxisとは?

DateAxisは、その名の通りExcelグラフの日付軸を専門に扱うためのオブジェクトです。openpyxl.chart.axisモジュールに含まれており、グラフのX軸(またはY軸)が日付であることを明示的に指定するために使用します。

chart.x_axisにDateAxisを設定する

使い方は非常にシンプルです。先ほどの失敗例のコードに、たった2行追加するだけで問題は解決します。

import datetime
from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference
# 1. DateAxisをインポートする
from openpyxl.chart.axis import DateAxis

# WorkbookとWorksheetを作成
wb = Workbook()
ws = wb.active
ws.title = "歩数記録"

# シートにデータを書き込む
data = [
    ["日付", "歩数"],
    [datetime.date(2023, 10, 1), 8500],
    [datetime.date(2023, 10, 2), 9200],
    [datetime.date(2023, 10, 3), 7800],
    [datetime.date(2023, 10, 4), 10500],
    [datetime.date(2023, 10, 5), 8800],
]
for row in data:
    ws.append(row)

# 折れ線グラフオブジェクトを作成
chart = LineChart()
chart.title = "10月上旬の歩数"
chart.y_axis.title = "歩数"
chart.x_axis.title = "日付"

# グラフのデータ範囲を設定
y_data = Reference(ws, min_col=2, min_row=1, max_row=6)
x_data = Reference(ws, min_col=1, min_row=2, max_row=6)
chart.add_data(y_data, titles_from_data=True)
chart.set_categories(x_data)

# 2. グラフのX軸にDateAxisを設定する ★★★ここが重要★★★
chart.x_axis = DateAxis()

# シートにグラフを追加
ws.add_chart(chart, "D2")

# Excelファイルを保存
wb.save("with_date_axis.xlsx")

このコードを実行してwith_date_axis.xlsxを開くと、今度はグラフの横軸が正しく「2023/10/1, 2023/10/2, …」と日付で表示されていることが確認できます。

このように、chart.x_axisをデフォルトのAxisからDateAxisに差し替えることで、openpyxlは横軸のデータを日付として解釈してくれるようになります。

もっと見やすく!DateAxisのカスタマイズ設定

基本的な日付軸が作成できたら、次はグラフをより「美しく」「見やすく」するためのカスタマイズ方法を見ていきましょう。DateAxisオブジェクトには、見た目を調整するための便利なプロパティが多数用意されています。

日付の表示形式を変更する (number_format)

結論:number_formatプロパティで、日付の見た目を自由に変更できます。

デフォルトのyyyy/mm/dd形式ではなく、10月1日のように表示したい場合もあるでしょう。これはnumber_formatにExcelの表示形式コードを指定することで実現できます。

# ... chart.x_axis = DateAxis() の後に追加 ...

# 表示形式を「m月d日」形式に変更
chart.x_axis.number_format = 'm"月"d"日"'

# もちろん他の形式も可能です
# chart.x_axis.number_format = 'yyyy-mm-dd'
# chart.x_axis.number_format = 'yy/m/d'

軸の範囲(最小値・最大値)を指定する (min, max)

結論:minmaxプロパティで、グラフに表示する期間を限定できます。

データ範囲の一部だけをグラフに表示したい場合に便利です。Pythonのdatetimeオブジェクトを使って、表示したい期間の開始日と終了日を数値(Excelのシリアル値)に変換して指定します。

# ... chart.x_axis = DateAxis() の後に追加 ...

from openpyxl.utils.datetime import to_excel

# グラフの表示範囲を2023年10月2日から10月4日に限定
chart.x_axis.min = to_excel(datetime.date(2023, 10, 2))
chart.x_axis.max = to_excel(datetime.date(2023, 10, 4))

※注意: min, maxに設定する値はPythonのdatetimeオブジェクトそのものではなく、to_excel()で変換したシリアル値である点に注意してください。

目盛りの間隔と単位を調整する (major_unit, major_time_unit)

結論:major_unitmajor_time_unitで、目盛りの間隔を柔軟に設定できます。

データ期間が長くなると、毎日目盛り線が表示されてグラフが見にくくなることがあります。major_unit(間隔)とmajor_time_unit(単位)をセットで使うことで、目盛りの間隔を「7日ごと」「1ヶ月ごと」のように調整できます。

# ... chart.x_axis = DateAxis() の後に追加 ...

# 主目盛りを2日間隔にする
chart.x_axis.major_unit = 2
chart.x_axis.major_time_unit = "days" # 単位を「日」に指定

# 主目盛りを1ヶ月間隔にする場合は以下のようにします
# chart.x_axis.major_unit = 1
# chart.x_axis.major_time_unit = "months"

実践:売上推移グラフを作成する総合サンプルコード

これまでに学んだ知識を総動員して、より実践的な「過去30日間の売上推移グラフ」を作成してみましょう。

ダミーデータの生成

まずは、グラフの元となる30日分のダミーデータをPythonで生成します。

import random
import datetime

# 30日分のダミーデータを生成
sales_data = [["日付", "売上"]]
base_date = datetime.date.today() - datetime.timedelta(days=30)

for i in range(30):
    current_date = base_date + datetime.timedelta(days=i)
    # 乱数で売上データを生成 (50,000〜150,000)
    sales = random.randint(50000, 150000)
    sales_data.append([current_date, sales])

グラフの作成とカスタマイズ

次に、このデータをシートに書き込み、DateAxisをフル活用してグラフをカスタマイズします。

# --- 上記のコードからの続き ---
from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference
from openpyxl.chart.axis import DateAxis
from openpyxl.utils.datetime import to_excel

# WorkbookとWorksheetを作成
wb = Workbook()
ws = wb.active
ws.title = "売上レポート"

# シートにデータを書き込む
for row in sales_data:
    ws.append(row)

# 折れ線グラフオブジェクトを作成
chart = LineChart()
chart.title = "直近30日間の売上推移"
chart.style = 12 # グラフのスタイルを適用
chart.y_axis.title = "売上(円)"
chart.x_axis.title = "日付"

# グラフのデータ範囲を設定
y_data = Reference(ws, min_col=2, min_row=1, max_row=31)
x_data = Reference(ws, min_col=1, min_row=2, max_row=31)
chart.add_data(y_data, titles_from_data=True)
chart.set_categories(x_data)

# --- DateAxisのカスタマイズ ---
chart.x_axis = DateAxis()
chart.x_axis.number_format = 'm/d' # 表示形式を「月/日」に
chart.x_axis.major_tick_mark = "out" # 目盛りを外向きに

# 主目盛りを7日間隔(1週間ごと)に設定
chart.x_axis.major_unit = 7
chart.x_axis.major_time_unit = "days"

# Y軸の表示形式を桁区切りに
chart.y_axis.number_format = '#,##0'

# 凡例を非表示に
chart.legend = None

# シートにグラフを追加(大きめに配置)
ws.add_chart(chart, "D2")

# Excelファイルを保存
wb.save("sales_report_final.xlsx")

print("売上レポートのExcelファイルを生成しました。")

Excelファイルへの保存と確認

このコードを実行すると、sales_report_final.xlsxというファイルが生成されます。ファイルを開くと、横軸が「m/d」形式で、7日おきに目盛りが引かれた、非常に見やすい時系列グラフが作成されているはずです。

まとめ

最後に、この記事で学んだ重要なポイントを振り返りましょう。

  • openpyxlで時系列グラフを作成する際は、横軸がシリアル値にならないように**DateAxisが必須**です。
  • グラフオブジェクトのX軸にchart.x_axis = DateAxis()と設定するだけで、簡単に日付軸を適用できます。
  • number_formatプロパティを使えば、日付の表示形式を'yyyy/mm/dd''m月d日'などに自由にカスタマイズできます。
  • min, max, major_unit, major_time_unitなどを活用することで、軸の範囲や目盛りの間隔を細かく調整し、より洗練されたグラフを作成できます。

DateAxisを使いこなせば、PythonによるExcel帳票作成の自動化がさらに捗ります。ぜひ、ご自身の業務やプロジェクトで活用してみてください。

コメント

タイトルとURLをコピーしました