はじめに
PythonでExcelファイルを操作する際、openpyxl
ライブラリを使用することが一般的です。今回は、Excelファイル内の特定の列(例えば、日付)のデータを抽出してリストにまとめる方法について解説します。具体的には、メールの受信日時などを含む列から日付を抽出する実装を紹介します。
1. openpyxl
ライブラリを使用したExcelファイルの読み込み
まず、openpyxl
ライブラリを使ってExcelファイルを開き、必要な列のデータを取得します。例えば、次のコードは、2行目以降(ヘッダー行を除く)のデータを順番に処理します。
import openpyxl
# Excelファイルの読み込み
wb = openpyxl.load_workbook("emails.xlsx")
sheet = wb.active
# 2行目からのデータを抽出
dates = [row[2] for row in sheet.iter_rows(min_row=2, values_only=True) if row[2]]
2. データの抽出について
dates = [row[2] for row in sheet.iter_rows(min_row=2, values_only=True) if row[2]]
1. sheet.iter_rows(min_row=2, values_only=True)
sheet.iter_rows(min_row=2, values_only=True) は、openpyxlライブラリを使ってExcelシートを操作する際のメソッドです。
min_row=2 は、2行目からデータを読み始めるという意味です。つまり、1行目(ヘッダー行)を除いて、2行目からデータを取得します。
values_only=True は、セルの値のみを取得するというオプションです。これにより、セルのオブジェクトそのものではなく、セルに格納されているデータ(例えば文字列、数値、日付など)がリストとして取得されます。
2. for row in sheet.iter_rows(...)
for row in sheet.iter_rows(...) は、2行目以降の各行を1行ずつループします。各行はリスト形式で取得され、row という変数に格納されます。
row は、行の各セルの値を含んだタプルになります。
3. row[2]
row[2] は、各行の3列目のデータを指します。インデックスが0から始まるため、row[2] は「3列目」のデータを取得することになります。
ここで取得しているのは、メールの日時が格納されている列(Excelシートの「Date」列)です。
4. if row[2]
if row[2] は、row[2] に値が存在するかどうかを確認しています。もし3列目に値が入っていれば、その値(日時)をリストに追加します。
空のセル(値がないセル)や None が入っている場合は、その行はスキップされます。
5. リスト内包表記
[row[2] for row in sheet.iter_rows(min_row=2, values_only=True) if row[2]] はリスト内包表記という形式で書かれており、sheet.iter_rows(...) で取得した各行について、3列目(row[2])の値が存在する場合に、その値をリスト dates に格納する処理です。
3. 結果として得られるリスト
この処理が成功すると、dates
というリストには、指定した列の日付データが格納されます。例えば、以下のようなExcelデータがある場合:
Subject | From | Date | Body |
---|---|---|---|
メール1 | example1@gmail.com | Wed, 01 Jan 2025 10:16:39 GMT | メール本文1 |
メール2 | example2@gmail.com | Thu, 02 Jan 2025 11:20:41 GMT | メール本文2 |
メール3 | example3@gmail.com | None | メール本文3 |
この場合、dates
リストには次のように日付が格納されます:
dates = [
"Wed, 01 Jan 2025 10:16:39 GMT",
"Thu, 02 Jan 2025 11:20:41 GMT"
]
None
が含まれている行はスキップされ、リストには実際の日時のみが含まれます。
4. VBAで行った場合
VBAではこんなにコードを書かなければいけないところをPythonでは1行で行うことができる
Sub GetDatesFromExcel()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim dates As Collection
Dim cellValue As Variant
' シートの設定(例: "Sheet1")
Set ws = ThisWorkbook.Sheets("Sheet1")
' 最終行の取得
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' 日付を格納するコレクションの初期化
Set dates = New Collection
' 2行目から最終行までループ
For i = 2 To lastRow
' 3列目(列C)の値を取得
cellValue = ws.Cells(i, 3).Value
' セルの値が空でない場合、コレクションに追加
If Not IsEmpty(cellValue) Then
dates.Add cellValue
End If
Next i
' 結果の表示(デバッグ用)
For Each date In dates
Debug.Print date
Next date
End Sub
まとめ
openpyxl
を使うことで、Excelファイルから簡単に特定のデータを抽出し、リストとして扱うことができます。この技術は、データ解析やメールの受信日時管理など、さまざまな場面で活用できます。
今回紹介した方法を参考に、Excelファイルを操作する際に特定の列を効率よく抽出し、データを整理することができるようになります。