[Python] openpyxlでエクセルの日付セルから日時を取得する方法

openpyxlを使用してエクセルの日付セルから日時を取得するには、まずセルの値を取得し、セルが日付形式であるかを確認します。

openpyxlでは、日付はPythonのdatetimeオブジェクトとして扱われます。

セルが日付形式かどうかはopenpyxl.utils.datetimeモジュールのis_date_format関数を使って確認できます。

日付形式であれば、セルの値をそのままdatetimeオブジェクトとして取得できます。

この記事でわかること
  • openpyxlを使った日付セルの操作方法
  • 日付形式とPythonの違いについて
  • シリアル値の扱い方と変換方法
  • 日付セルのフォーマット変更手法
  • 複数日付の取得やフィルタリング方法

目次から探す

日付セルから日時を取得する手順

日付セルの値を取得する

openpyxlライブラリを使用して、エクセルファイルから日付セルの値を取得する方法を説明します。

まず、エクセルファイルを読み込み、特定のセルの値を取得します。

以下はそのサンプルコードです。

import openpyxl
# エクセルファイルを読み込む
workbook = openpyxl.load_workbook('sample.xlsx')
sheet = workbook.active
# A1セルの値を取得する
date_value = sheet['A1'].value
print(date_value)

このコードを実行すると、A1セルに入力されている日付の値が出力されます。

日付形式かどうかを確認する

取得した値が日付形式かどうかを確認するためには、isinstance関数を使用します。

以下のサンプルコードでは、日付形式かどうかをチェックしています。

import openpyxl
from datetime import datetime
# エクセルファイルを読み込む
workbook = openpyxl.load_workbook('sample.xlsx')
sheet = workbook.active
# A1セルの値を取得する
date_value = sheet['A1'].value
# 日付形式かどうかを確認する
if isinstance(date_value, datetime):
    print("A1セルは日付形式です。")
else:
    print("A1セルは日付形式ではありません。")

このコードを実行すると、A1セルが日付形式かどうかの結果が出力されます。

日付形式のセルをdatetimeオブジェクトとして扱う

日付形式のセルをdatetimeオブジェクトとして扱うことで、日付の計算やフォーマット変更が可能になります。

以下のサンプルコードでは、日付をdatetimeオブジェクトとして取得し、特定のフォーマットで表示しています。

import openpyxl
from datetime import datetime
# エクセルファイルを読み込む
workbook = openpyxl.load_workbook('sample.xlsx')
sheet = workbook.active
# A1セルの値を取得する
date_value = sheet['A1'].value
# datetimeオブジェクトとして扱う
if isinstance(date_value, datetime):
    formatted_date = date_value.strftime('%Y年%m月%d日')
    print(f"フォーマットされた日付: {formatted_date}")

このコードを実行すると、A1セルの日付が「YYYY年MM月DD日」の形式で出力されます。

日付セルのフォーマットを指定する方法

日付セルのフォーマットを指定するには、strftimeメソッドを使用します。

以下のサンプルコードでは、異なるフォーマットで日付を表示しています。

import openpyxl
from datetime import datetime
# エクセルファイルを読み込む
workbook = openpyxl.load_workbook('sample.xlsx')
sheet = workbook.active
# A1セルの値を取得する
date_value = sheet['A1'].value
# 日付のフォーマットを指定する
if isinstance(date_value, datetime):
    formatted_date1 = date_value.strftime('%Y/%m/%d')
    formatted_date2 = date_value.strftime('%d-%m-%Y')
    print(f"フォーマット1: {formatted_date1}")
    print(f"フォーマット2: {formatted_date2}")

このコードを実行すると、A1セルの日付が異なるフォーマットで出力されます。

日付セルのフォーマットに関する注意点

エクセルの日付形式とPythonのdatetimeの違い

エクセルでは、日付はシリアル値として管理されており、1900年1月1日を基準にして日数がカウントされます。

一方、Pythonのdatetimeモジュールでは、日付と時刻をオブジェクトとして扱います。

このため、エクセルから取得した日付をdatetimeオブジェクトに変換する際には、シリアル値を適切に処理する必要があります。

スクロールできます
エクセルの日付形式Pythonのdatetime形式
シリアル値(例:45000)datetime(2023, 10, 1)
基準日:1900年1月1日基準日:1970年1月1日(Unix時間)

日付がシリアル値として表示される場合の対処法

エクセルの日付がシリアル値として表示される場合、openpyxlを使用してその値をdatetimeオブジェクトに変換する必要があります。

以下のサンプルコードでは、シリアル値をdatetimeオブジェクトに変換する方法を示しています。

import openpyxl
from datetime import datetime, timedelta
# エクセルファイルを読み込む
workbook = openpyxl.load_workbook('sample.xlsx')
sheet = workbook.active
# A1セルの値を取得する
date_value = sheet['A1'].value
# シリアル値をdatetimeオブジェクトに変換する
if isinstance(date_value, (int, float)):  # シリアル値の場合
    date_value = datetime(1900, 1, 1) + timedelta(days=date_value - 2)  # 1900年1月1日からの日数を加算
    print(f"変換された日付: {date_value.strftime('%Y年%m月%d日')}")

このコードを実行すると、シリアル値が適切にdatetimeオブジェクトに変換され、フォーマットされた日付が出力されます。

日付のタイムゾーンに関する注意点

Pythonのdatetimeオブジェクトは、デフォルトではタイムゾーン情報を持たない naive なオブジェクトです。

エクセルの日付がタイムゾーンを含む場合、pytzライブラリを使用してタイムゾーンを設定する必要があります。

以下のサンプルコードでは、タイムゾーンを設定する方法を示しています。

import openpyxl
from datetime import datetime
import pytz
# エクセルファイルを読み込む
workbook = openpyxl.load_workbook('sample.xlsx')
sheet = workbook.active
# A1セルの値を取得する
date_value = sheet['A1'].value
# datetimeオブジェクトにタイムゾーンを設定する
if isinstance(date_value, datetime):
    tokyo_tz = pytz.timezone('Asia/Tokyo')
    date_value = tokyo_tz.localize(date_value)  # 東京のタイムゾーンを設定
    print(f"タイムゾーン設定後の日付: {date_value.strftime('%Y年%m月%d日 %H:%M:%S %Z')}")

このコードを実行すると、指定したタイムゾーンが設定された日付が出力されます。

タイムゾーンを考慮することで、異なる地域での日時の扱いが正確になります。

応用例:日付セルの操作

日付セルの値を文字列としてフォーマットする

日付セルの値を特定の文字列形式でフォーマットするには、strftimeメソッドを使用します。

以下のサンプルコードでは、日付セルの値を YYYY/MM/DD 形式の文字列に変換しています。

import openpyxl
from datetime import datetime
# エクセルファイルを読み込む
workbook = openpyxl.load_workbook('sample.xlsx')
sheet = workbook.active
# A1セルの値を取得する
date_value = sheet['A1'].value
# 日付を文字列としてフォーマットする
if isinstance(date_value, datetime):
    formatted_date = date_value.strftime('%Y/%m/%d')
    print(f"フォーマットされた日付: {formatted_date}")

このコードを実行すると、A1セルの日付が YYYY/MM/DD の形式で出力されます。

日付セルの範囲を一括で取得する

複数のセルから日付を一括で取得するには、セルの範囲を指定してループ処理を行います。

以下のサンプルコードでは、A1からA10までのセルの値を取得しています。

import openpyxl
# エクセルファイルを読み込む
workbook = openpyxl.load_workbook('sample.xlsx')
sheet = workbook.active
# A1からA10までのセルの値を取得する
date_values = []
for row in sheet['A1:A10']:
    for cell in row:
        date_values.append(cell.value)
print("取得した日付セルの値:")
for date in date_values:
    print(date)

このコードを実行すると、A1からA10までのセルに入力されている日付の値が出力されます。

日付セルの値をフィルタリングする

特定の条件に基づいて日付セルの値をフィルタリングすることも可能です。

以下のサンプルコードでは、2023年以降の日付をフィルタリングしています。

import openpyxl
from datetime import datetime
# エクセルファイルを読み込む
workbook = openpyxl.load_workbook('sample.xlsx')
sheet = workbook.active
# A1からA10までのセルの値をフィルタリングする
filtered_dates = []
for row in sheet['A1:A10']:
    for cell in row:
        if isinstance(cell.value, datetime) and cell.value.year >= 2023:
            filtered_dates.append(cell.value)
print("2023年以降の日付:")
for date in filtered_dates:
    print(date.strftime('%Y年%m月%d日'))

このコードを実行すると、2023年以降の日付が出力されます。

日付セルに新しい値を設定する方法

日付セルに新しい値を設定するには、セルに直接値を代入します。

以下のサンプルコードでは、A1セルに新しい日付を設定しています。

import openpyxl
from datetime import datetime
# エクセルファイルを読み込む
workbook = openpyxl.load_workbook('sample.xlsx')
sheet = workbook.active
# A1セルに新しい日付を設定する
new_date = datetime(2023, 10, 1)  # 新しい日付
sheet['A1'] = new_date
# 変更を保存する
workbook.save('sample.xlsx')
print("A1セルに新しい日付を設定しました。")

このコードを実行すると、A1セルに新しい日付が設定され、エクセルファイルが更新されます。

よくある質問

日付セルがシリアル値として表示されるのはなぜ?

エクセルでは、日付をシリアル値として管理しています。

これは、1900年1月1日を基準日として、そこからの経過日数を整数で表現する方式です。

このため、エクセルから取得した日付がシリアル値として表示されることがあります。

Pythonでこのシリアル値を扱う場合は、適切にdatetimeオブジェクトに変換する必要があります。

日付セルのフォーマットを変更するにはどうすればいい?

日付セルのフォーマットを変更するには、openpyxlを使用してセルのnumber_formatプロパティを設定します。

例えば、以下のようにして日付の表示形式を変更できます。

例:sheet['A1'].number_format = 'YYYY/MM/DD'

このコードを実行することで、A1セルの日付の表示形式を YYYY/MM/DD に変更できます。

日付セルがNoneになる場合の対処法は?

日付セルがNoneになる場合、いくつかの原因が考えられます。

主な原因は以下の通りです。

  • セルが空である:エクセルの該当セルに日付が入力されていない場合、Noneが返されます。
  • シリアル値が無効である:シリアル値が正しくない場合、Noneが返されることがあります。
  • 読み込むエクセルファイルが正しくない:ファイルが破損しているか、正しい形式でない場合もNoneが返されることがあります。

これらの原因を確認し、必要に応じてエクセルファイルを修正するか、適切な値を設定することで対処できます。

まとめ

この記事では、Pythonのopenpyxlライブラリを使用してエクセルの日付セルから日時を取得する方法や、日付セルの操作に関するさまざまなテクニックについて詳しく解説しました。

特に、日付セルの値を取得する手順や、日付形式の確認、シリアル値の扱い、フォーマットの変更方法など、実践的な内容に焦点を当てています。

これらの知識を活用して、エクセルデータの処理や分析をより効率的に行うことができるでしょう。

次回は、実際のプロジェクトでこれらのテクニックを試してみて、さらなるスキル向上を目指してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • Microsoft Office (27)
  • Google (21)
  • URLをコピーしました!
目次から探す