1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonでExcelファイルから特定のデータを抽出しリストにまとめる方法

Last updated at Posted at 2025-01-28

はじめに

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ファイルを操作する際に特定の列を効率よく抽出し、データを整理することができるようになります。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?