PythonでExcelの日付を扱う方法|openpyxlで読み込み・変換・書式設定

PythonでExcelファイルを操作していると、「日付」の扱いで戸惑うことがあります。

例えば、Excelでは、

2026/01/05

と表示されているのに、Pythonで読み込むと、

2026-01-05 00:00:00

のように表示されることがあります。

また、Excelの日付がPythonで数値として読み込まれるケースもあります。

この記事では、Pythonのopenpyxlを使って、Excelの日付を扱う方法を初心者向けに解説します。

具体的には、

  • Excelの日付をPythonで読み込む
  • dateとdatetimeの違い
  • 日付から時刻を取り除く
  • 日付を好きな形式で表示する
  • 文字列を日付に変換する
  • Excelの日付をPythonで比較する
  • PythonからExcelへ日付を書き込む
  • Excelの日付の表示形式を変更する
  • Excelのシリアル値を日付に変換する

といった内容を紹介します。

  1. PythonでExcelの日付を扱うには?
    1. openpyxlをインストールする
  2. Excelの日付をPythonで読み込む
  3. dateとdatetimeの違い
    1. dateとは?
    2. datetimeとは?
  4. Excelの日付から時刻を取り除く
  5. Pythonの日付を好きな形式で表示する
    1. strftime()とは?
    2. よく使う書式
  6. 文字列をPythonの日付に変換する
    1. strptime()とは?
  7. strptime()とstrftime()の違い
  8. PythonでExcelの日付を比較する
  9. Excelのデータを期間で絞り込む
  10. PythonでExcelのデータを日付順に並べ替える
  11. PythonからExcelへ日付を書き込む
  12. Excelの日付の表示形式を設定する
    1. よく使う日付の表示形式
  13. 「表示形式」と「データ」は別物
  14. Excelの日付が数字として扱われる場合
  15. Excelのシリアル値をPythonの日付に変換する
  16. Excelの日付を読み込んで別のExcelファイルに書き込む
  17. Excelの日付を扱うときの注意点
    1. 日付が文字列になっていないか確認する
    2. 日付と文字列を混在させない
    3. strftime()で文字列にすると日付データではなくなる
  18. PythonでExcelの日付を扱えると何ができる?
    1. 売上データの集計
    2. 指定期間のデータ抽出
    3. 古いデータの検索
    4. 複数のExcelファイルを統合する
  19. 複数のExcelファイルをまとめる場合にも日付処理が重要
  20. よくある疑問・トラブル
    1. 2026-01-05 00:00:00と表示される
    2. Excelでは日付なのにPythonでは数字になる
    3. strptime()でエラーになる
    4. Excelに日付を書き込んだら表示がおかしい
  21. まとめ

PythonでExcelの日付を扱うには?

PythonでExcelファイルを操作する場合、openpyxlがよく使われます。

まずは、Excelファイルを用意します。

名前は sample.xlsx にして、中に次のようなデータを入力してください。

日付商品売上
2026/01/05商品A5000
2026/01/10商品B3000
2026/01/15商品C7000

このExcelファイルをPythonで読み込んでみます。

openpyxlをインストールする

まだopenpyxlをインストールしていない場合は、ターミナルやコマンドプロンプトで次のコマンドを実行します。

pip install openpyxl

インストール後、Pythonから読み込めるか確認します。

import openpyxl

print(openpyxl.__version__)

バージョン番号が表示されれば、インストールは完了です。


openpyxl のインストールの仕方は、こちらの記事でより詳しく解説しています。

・PythonでExcelファイルを操作する方法|初心者向けに読み込み・書き込みを解説

Excelの日付をPythonで読み込む

まず、Excelファイルを読み込んで、A2セルの日付を取得してみます。

import openpyxl

book = openpyxl.load_workbook("sample.xlsx")
sheet = book.active

date_value = sheet["A2"].value

print(date_value)
print(type(date_value))

ExcelのA2セルに2026/01/05が入っている場合、例えば次のような結果になります。

2026-01-05 00:00:00
<class 'datetime.datetime'>

Excelでは、

2026/01/05

と表示されていたのに、Pythonでは、

2026-01-05 00:00:00

となっています。

これは、openpyxlがExcelの日付をPythonのdatetimeとして読み込んでいるためです。


dateとdatetimeの違い

Pythonで日付を扱うときには、dateとdatetimeという2つの型がよく登場します。

dateとは?

dateは、年・月・日だけを扱います。

from datetime import date

today = date(2026, 1, 5)

print(today)

結果:

2026-01-05

時刻は含まれていません。

datetimeとは?

datetimeは、日付に加えて時刻も扱えます。

from datetime import datetime

now = datetime(2026, 1, 5, 12, 30)

print(now)

結果:

2026-01-05 12:30:00

つまり、

date
→ 年・月・日

datetime
→ 年・月・日・時・分・秒

という違いがあります。

Excelの日付を読み込んだときに、

2026-01-05 00:00:00

となるのは、datetimeとして扱われているためです。


Excelの日付から時刻を取り除く

Excelでは日付しか使っていないのに、

2026-01-05 00:00:00

と表示されると、少し気になりますよね。

この場合、datetimeから日付だけを取り出すことができます。

date_value = sheet["A2"].value

print(date_value.date())

結果:

2026-01-05

.date()を使うことで、datetimeから日付部分だけを取り出せます。

例えば、

import openpyxl

book = openpyxl.load_workbook("sample.xlsx")
sheet = book.active

date_value = sheet["A2"].value

print(date_value)
print(date_value.date())

とすれば、

2026-01-05 00:00:00
2026-01-05

のようになります。


Pythonの日付を好きな形式で表示する

Pythonでは、日付の表示形式を変更することもできます。

例えば、

2026-01-05

を、

2026/01/05

と表示したい場合です。

このときはstrftime()を使います。

date_value.strftime("%Y/%m/%d")

例えば、

import openpyxl

book = openpyxl.load_workbook("sample.xlsx")
sheet = book.active

date_value = sheet["A2"].value

print(date_value.strftime("%Y/%m/%d"))

結果:

2026/01/05

となります。

strftime()とは?

strftime()は、日付や時刻を指定した形式の文字列に変換するためのメソッドです。

例えば、

date_value.strftime("%Y年%m月%d日")

とすると、

2026年01月05日

となります。

よく使う書式

書式意味
%Y4桁の年
%m2桁の月
%d2桁の日
%H時
%M分
%S秒

例えば、

date_value.strftime("%Y/%m/%d")

なら、

2026/01/05

になります。


文字列をPythonの日付に変換する

Excelのデータによっては、日付が文字列として保存されている場合があります。

例えば、

2026/01/05

という文字列です。

この場合はdatetime.strptime()を使って日付に変換できます。

from datetime import datetime

date_value = datetime.strptime("2026/01/05", "%Y/%m/%d")

print(date_value)

結果:

2026-01-05 00:00:00

strptime()とは?

strptime()は、文字列をdatetimeに変換するためのメソッドです。

例えば、

2026/01/05

という文字列を、

datetime

に変換できます。

ここで重要なのが、文字列の形式と指定するフォーマットを一致させることです。

datetime.strptime("2026/01/05", "%Y/%m/%d")

の場合、

%Y → 2026
%m → 01
%d → 05

となっています。


strptime()とstrftime()の違い

名前が似ているので、最初は混乱しやすいところです。

簡単に覚えるなら、

strptime
文字列 → 日付

strftime
日付 → 文字列

です。

例えば、

from datetime import datetime

date_value = datetime.strptime("2026/01/05", "%Y/%m/%d")

print(date_value)

で、文字列を日付に変換できます。

反対に、

print(date_value.strftime("%Y/%m/%d"))

で、日付を文字列に変換できます。


PythonでExcelの日付を比較する

日付をPythonで扱えるようになると、日付同士の比較もできます。

例えば、

import openpyxl
from datetime import date

target_date = date(2026, 1, 1)

book = openpyxl.load_workbook("sample.xlsx")
sheet = book.active

date_value = sheet["A2"].value

if date_value.date() >= target_date:
    print("対象の日付です")

結果:

対象の日付です

となります。

この機能を使えば、

  • 指定日以降のデータだけ取得する
  • 指定日以前のデータを取得する
  • 特定の期間だけ抽出する

といった処理ができます。


Excelのデータを期間で絞り込む

例えば、2026年1月のデータだけを取得したいとします。

import openpyxl
from datetime import date

start_date = date(2026, 1, 1)
end_date = date(2026, 1, 31)

book = openpyxl.load_workbook("sample.xlsx")
sheet = book.active

date_value = sheet["A2"].value

if start_date <= date_value.date() <= end_date:
    print("2026年1月のデータです")

このように日付を比較することで、指定した期間のデータだけを処理できます。

売上データや勤怠データなどを扱う場合に便利です。


PythonでExcelのデータを日付順に並べ替える

ExcelのデータをPythonで処理するとき、日付順に並べ替えたい場合もあります。

例えば、

data = [
    [date(2026, 1, 15), "商品C", 7000],
    [date(2026, 1, 5), "商品A", 5000],
    [date(2026, 1, 10), "商品B", 3000]
]

というデータがあるとします。

日付順に並べるには、sort()を使います。

data.sort(key=lambda x: x[0])

すると、

2026-01-05
2026-01-10
2026-01-15

の順番になります。

例えば、

from datetime import date

data = [
    [date(2026, 1, 15), "商品C", 7000],
    [date(2026, 1, 5), "商品A", 5000],
    [date(2026, 1, 10), "商品B", 3000]
]

data.sort(key=lambda x: x[0])

for row in data:
    formatted_date = str(row[0])
    print(f"[{formatted_date}, '{row[1]}', {row[2]}]")

結果:

[2026-01-05, '商品A', 5000]
[2026-01-10, '商品B', 3000]
[2026-01-15, '商品C', 7000]

Excelの売上データや作業記録などを整理するときに便利です。


PythonからExcelへ日付を書き込む

ここまではExcelからPythonへ日付を読み込む方法を紹介しました。

次は、PythonからExcelへ日付を書き込んでみましょう。

まず、Workbookを使って新しいExcelファイルを作ります。

import openpyxl
from datetime import date

book = openpyxl.Workbook()
sheet = book.active

sheet["A1"] = date(2026, 1, 5)

book.save("date.xlsx")

これでdate.xlsxが作成されます。

A1セルには、

2026-01-05

という日付データが入ります。


Excelの日付の表示形式を設定する

PythonからExcelへ日付を書き込んだ場合、Excel上でどのように表示するかを指定することもできます。

そのときに使うのがnumber_formatです。

sheet["A1"].number_format = "yyyy/mm/dd"

例えば、次のように書けます。

import openpyxl
from datetime import date

book = openpyxl.Workbook()
sheet = book.active

sheet["A1"] = date(2026, 1, 5)
sheet["A1"].number_format = "yyyy/mm/dd"

book.save("date.xlsx")

Excelで開くと、

2026/01/05

のように表示されます。

よく使う日付の表示形式

yyyy/mm/dd

↓

2026/01/05
yyyy-mm-dd

↓

2026-01-05
yyyy年mm月dd日

↓

2026年01月05日

このように、number_formatを変更することでExcel上の見た目を変更できます。


「表示形式」と「データ」は別物

Excelの日付を扱うときに重要なのが、

Excel上の表示と、実際に保存されているデータは別物

ということです。

例えば、

2026/01/05

と表示されていても、内部では日付データとして保存されています。

Pythonから、

sheet["A1"] = date(2026, 1, 5)

と書き込み、

sheet["A1"].number_format = "yyyy/mm/dd"

と指定すれば、

日付データとして保存しながら、Excelでは2026/01/05と表示する

ことができます。

これは、日付を扱うプログラムでは重要な考え方です。


Excelの日付が数字として扱われる場合

Excelの日付を扱っていると、

46027

のような数字を見かけることがあります。

これは、Excelが日付を内部的に数値として扱っているためです。

Excelでは、日付を「シリアル値」と呼ばれる数値で管理することがあります。

そのため、Excelファイルによっては、Python側で数値として取得されるケースがあります。


Excelのシリアル値をPythonの日付に変換する

openpyxlには、Excelのシリアル値を日付に変換するfrom_excel()があります。

from openpyxl.utils.datetime import from_excel

date_value = from_excel(46027)

print(date_value)

結果:

2026-01-05 00:00:00

このように、Excelのシリアル値をPythonの日付として扱えるようにできます。


Excelの日付を読み込んで別のExcelファイルに書き込む

実践的な例として、

Excelからデータを読み込み、日付の表示形式を指定

別のExcelファイルへ書き込み

をしてみます。

import openpyxl

input_book = openpyxl.load_workbook("sample.xlsx")
input_sheet = input_book.active

output_book = openpyxl.Workbook()
output_sheet = output_book.active

output_sheet.append(["日付", "商品", "売上"])

for row in input_sheet.iter_rows(min_row=2):
    date_value = row[0].value
    product = row[1].value
    sales = row[2].value

    output_sheet.append([
        date_value,
        product,
        sales
    ])

    output_sheet.cell(
        row=output_sheet.max_row,
        column=1
    ).number_format = "yyyy年mm月dd日"

output_book.save("result.xlsx")

print("処理が完了しました")

このプログラムでは、

  1. sales.xlsxを読み込む
  2. 日付・商品・売上を取得する
  3. 新しいExcelファイルを作る
  4. データを書き込む
  5. 日付の表示形式をyyyy年mm月dd日に設定する
  6. result.xlsxとして保存する

という処理を行っています。


Excelの日付を扱うときの注意点

日付が文字列になっていないか確認する

Excelでは、

2026/01/05

と表示されていても、実際には文字列として保存されている場合があります。

Pythonで読み込んだときに、

print(type(date_value))

とすれば、どのような型になっているか確認できます。

例えば、

<class 'datetime.datetime'>

ならdatetimeです。

一方、

<class 'str'>

なら文字列です。


日付と文字列を混在させない

例えば、

2026/01/05
2026/01/10
2026/01/15

のような日付データの中に、文字列として保存された日付が混ざっていると、処理が複雑になることがあります。

複数のExcelファイルをまとめる場合などは、日付の形式をできるだけ統一しておくと安心です。


strftime()で文字列にすると日付データではなくなる

例えば、

date_value = date_value.strftime("%Y/%m/%d")

とすると、見た目はきれいになります。

しかし、これは文字列になります。

そのため、その後に日付の比較や計算をする場合は注意が必要です。

例えば、

"2026/01/05"

は文字列です。

一方、

date(2026, 1, 5)

は日付データです。

「見た目を整えたいだけ」なら、Excelではnumber_formatを使う方法も検討しましょう。


PythonでExcelの日付を扱えると何ができる?

Excelの日付をPythonで正しく扱えるようになると、さまざまな作業を自動化できます。

例えば、

売上データの集計

2026年1月
2026年2月
2026年3月

のように月別に売上を集計できます。

指定期間のデータ抽出

2026/01/01 ~ 2026/01/31

のように期間を指定してデータを抽出できます。

古いデータの検索

例えば、

1年以上前のデータ

だけを探すこともできます。

複数のExcelファイルを統合する

各月のExcelファイルを読み込み、日付を統一して1つのファイルにまとめることもできます。

このような処理は、Excelを使った事務作業の自動化で非常に役立ちます。


複数のExcelファイルをまとめる場合にも日付処理が重要

例えば、

sales_01.xlsx
sales_02.xlsx
sales_03.xlsx

のように月ごとのExcelファイルがあるとします。

これらをPythonで1つにまとめる場合、ファイルによって日付の読み込まれ方が違うと、処理に問題が起きる可能性があります。

そのため、

Excelの日付
↓
Pythonで日付を統一
↓
1つのExcelファイルへまとめる

という処理が重要になります。

複数ファイルをまとめる処理では、今回紹介した日付の知識が役立ちます。


実際に複数のExcelファイルを1つにまとめる方法については、こちらの記事で詳しく解説しています。

参考記事
・Pythonで複数のExcelファイルを1つにまとめる方法|openpyxlで一括処理

よくある疑問・トラブル

2026-01-05 00:00:00と表示される

Excelの日付がPythonでdatetimeとして読み込まれている可能性があります。

日付だけ必要なら、

date_value.date()

で日付部分を取り出せます。


Excelでは日付なのにPythonでは数字になる

Excelの日付がシリアル値として扱われている可能性があります。

その場合は、openpyxlのfrom_excel()を使って日付に変換できます。

from openpyxl.utils.datetime import from_excel

date_value = from_excel(value, book.epoch)

strptime()でエラーになる

文字列の形式と指定したフォーマットが一致していない可能性があります。

例えば、

2026/01/05

なら、

"%Y/%m/%d"

です。

一方、

2026-01-05

なら、

"%Y-%m-%d"

になります。


Excelに日付を書き込んだら表示がおかしい

Excelに日付データを書き込んだだけでは、希望する表示形式にならないことがあります。

その場合は、

sheet["A1"].number_format = "yyyy/mm/dd"

のようにnumber_formatを指定します。


まとめ

PythonでExcelの日付を扱う場合、まず覚えておきたいのは、Excelの日付とPythonの日付では扱い方が少し違うということです。

openpyxlを使うことで、Excelの日付をPythonから読み込んだり、Pythonの日付をExcelへ書き込んだりできます。

今回紹介した主な方法をまとめると、

やりたいこと方法
Excelを読み込むopenpyxl.load_workbook()
日付だけ取り出す.date()
日付を文字列にするstrftime()
文字列を日付にするstrptime()
Excelのシリアル値を変換するfrom_excel()
Excelに日付を書き込むdate() / datetime()
Excelの日付表示を変更するnumber_format
日付を比較する<、>、<=、>=
日付順に並べるsort()

特に重要なのが、

Python上の日付データ

と、

Excel上での日付の表示形式

は別に考えるということです。

例えば、

sheet["A1"] = date(2026, 1, 5)
sheet["A1"].number_format = "yyyy/mm/dd"

とすれば、日付データとして保存しながら、Excelでは、

2026/01/05

と表示できます。

Excelの日付を正しく扱えるようになると、単純な読み書きだけでなく、期間指定・データ抽出・並べ替え・集計・複数ファイルの統合など、より実用的なExcel自動化にもつながります。

PythonでExcel作業を自動化するときは、日付の扱いを理解しておくと、できることが大きく広がります。

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