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のシリアル値を日付に変換する
といった内容を紹介します。
- PythonでExcelの日付を扱うには?
- Excelの日付をPythonで読み込む
- dateとdatetimeの違い
- Excelの日付から時刻を取り除く
- Pythonの日付を好きな形式で表示する
- 文字列をPythonの日付に変換する
- strptime()とstrftime()の違い
- PythonでExcelの日付を比較する
- Excelのデータを期間で絞り込む
- PythonでExcelのデータを日付順に並べ替える
- PythonからExcelへ日付を書き込む
- Excelの日付の表示形式を設定する
- 「表示形式」と「データ」は別物
- Excelの日付が数字として扱われる場合
- Excelのシリアル値をPythonの日付に変換する
- Excelの日付を読み込んで別のExcelファイルに書き込む
- Excelの日付を扱うときの注意点
- PythonでExcelの日付を扱えると何ができる?
- 複数のExcelファイルをまとめる場合にも日付処理が重要
- よくある疑問・トラブル
- まとめ
PythonでExcelの日付を扱うには?
PythonでExcelファイルを操作する場合、openpyxlがよく使われます。
まずは、Excelファイルを用意します。
名前は sample.xlsx にして、中に次のようなデータを入力してください。
| 日付 | 商品 | 売上 |
|---|---|---|
| 2026/01/05 | 商品A | 5000 |
| 2026/01/10 | 商品B | 3000 |
| 2026/01/15 | 商品C | 7000 |
このExcelファイルをPythonで読み込んでみます。
openpyxlをインストールする
まだopenpyxlをインストールしていない場合は、ターミナルやコマンドプロンプトで次のコマンドを実行します。
pip install openpyxl
インストール後、Pythonから読み込めるか確認します。
import openpyxl
print(openpyxl.__version__)
バージョン番号が表示されれば、インストールは完了です。
openpyxl のインストールの仕方は、こちらの記事でより詳しく解説しています。
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日
となります。
よく使う書式
| 書式 | 意味 |
|---|---|
%Y | 4桁の年 |
%m | 2桁の月 |
%d | 2桁の日 |
%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("処理が完了しました")
このプログラムでは、
sales.xlsxを読み込む- 日付・商品・売上を取得する
- 新しいExcelファイルを作る
- データを書き込む
- 日付の表示形式を
yyyy年mm月dd日に設定する 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つにまとめる方法については、こちらの記事で詳しく解説しています。
よくある疑問・トラブル
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作業を自動化するときは、日付の扱いを理解しておくと、できることが大きく広がります。
