Python | 標準ライブラリ(csv + pathlib + collections + datetime)だけ を使って、CSVを「商品ごと × 日付ごと」にクロス集計する実践例

Python
スポンサーリンク

ここでは 標準ライブラリ(csv + pathlib + collections + datetime)だけ を使って、CSVを「月ごと × 商品ごと」にクロス集計する実践例を紹介します。


想定データ(sales.csv)

日付,商品,数量,金額
2025-11-01,りんご,10,3000
2025-11-01,みかん,5,2000
2025-12-02,りんご,7,2100
2025-12-02,バナナ,4,1200
2025-12-15,みかん,12,4800
2026-01-03,りんご,3,900

コード例:月ごと×商品ごとのクロス集計

import csv
from pathlib import Path
from collections import defaultdict
from datetime import datetime

csv_path = Path.home() / "Documents" / "sales.csv"

# 集計用: {商品: {月: {"数量":合計, "金額":合計}}}
summary = defaultdict(lambda: defaultdict(lambda: {"数量": 0, "金額": 0}))

with csv_path.open("r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        # 日付をdatetimeに変換して「YYYY-MM」にまとめる
        date = datetime.strptime(row["日付"], "%Y-%m-%d")
        month = date.strftime("%Y-%m")  # 例: "2025-11"
        product = row["商品"]
        qty = int(row["数量"])
        price = int(row["金額"])
        summary[product][month]["数量"] += qty
        summary[product][month]["金額"] += price

# 表示(商品ごとに月順で出力)
for product, months in summary.items():
    print(f"=== {product} ===")
    for month, data in sorted(months.items()):
        print(f"{month}: 数量={data['数量']}, 金額={data['金額']}")
Python

出力例

=== りんご ===
2025-11: 数量=10, 金額=3000
2025-12: 数量=7, 金額=2100
2026-01: 数量=3, 金額=900

=== みかん ===
2025-11: 数量=5, 金額=2000
2025-12: 数量=12, 金額=4800

=== バナナ ===
2025-12: 数量=4, 金額=1200

応用例1: クロス集計をCSVに保存(ピボット形式)

output_path = csv_path.parent / "monthly_cross_summary.csv"

# 全ての月を抽出してソート
all_months = sorted({m for months in summary.values() for m in months})

with output_path.open("w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    # ヘッダー行: 商品, 各月
    writer.writerow(["商品"] + all_months)
    for product, months in summary.items():
        row = [product]
        for m in all_months:
            row.append(months[m]["数量"] if m in months else 0)
        writer.writerow(row)

print("月ごと×商品ごとのクロス集計を保存しました:", output_path)
Python

👉 出力CSVイメージ:

商品,2025-11,2025-12,2026-01
りんご,10,7,3
みかん,5,12,0
バナナ,0,4,0

まとめ

  • datetime.strptime で日付を正規化し、strftime("%Y-%m") で月単位にまとめる
  • defaultdict の入れ子で「商品 × 月」の二次元集計
  • 出力をクロス集計表にすればExcelやBIツールでの分析に直結

👉 次のステップとしては、「商品ごとに売上トップの月を抽出」「月ごとに売上ランキングを出す」などに発展させるとさらに実務的になります。

Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました