onaka0_0suita
@onaka0_0suita (m- yuto)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Python3】csvファイルからデータの集計について

解決したいこと

当方、Python初学者です。
Pythonを学習しており、csvファイルを読み込み、データの集計をしたいと考えております。
CSVファイルには、日付、品名、値段があり、
日付は月ごとに、飲み物は取得しない、値段は月ごとの合計で集計したいです。

例)
2020-03-01 10:00:00, お茶, 100
2020-03-02 12:00:00, コーラ, 150
2020-03-03 14:00:00, 水, 100
2020-04-01 10:00:00, お茶, 100
2020-04-02 11:00:00, オレンジジュース, 150
2020-04-03 12:00:00, コーヒー, 120

出力結果)
3月: 350
4月: 370

上記のような形にしたいです。

該当するソースコード

現在のコードが下記になります。

import csv
import datetime

with open('../input/sample.csv', 'r') as f:
    for row in f:
        rows = row.rstrip().split(',')
        if 1 < len(rows):
            print(rows)

自分で試したこと

csvファイルの読み込みまで出来ており、月のみ取得するコードも分かっておりますが、上手くいきません。
下記のコードはどこに配置するのか、if文の配下かなと思い、配置してみたのですが、
「Traceback (most recent call last):
File "summary_month.py", line 10, in
datetime_change = datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S')
AttributeError: module 'datetime' has no attribute 'strptime'」
というエラーが出てしまいます。

datetime_change = datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S')
print(datetime_change.month)

また、月のみの表示が出来た際には、月ごとの集計を行い、if文を使用して集計するかと思うのですが、どのようにif文を展開するのかが、明確なイメージが付きませんでした。

お手数おかけしますが、ご教授頂けますと幸いです。
よろしくお願いいたします。

0

2Answer

strptimedatetime モジュールにある datetime クラスのメソッドです。したがって、以下のように datetime.datetime.strptime() と呼び出す必要があります。

import datetime
dt = datetime.datetime.strptime('2020-03-01', '%Y-%m-%d')

または from datetime import datetime でクラスをインポートすればモジュール名を省略できます。

from datetime import datetime
dt = datetime.strptime('2020-03-01', '%Y-%m-%d')

集計については if 文を使わなくても辞書を使えばスマートに実装できます:

import csv
from collections import defaultdict
from datetime import datetime

stats = defaultdict(int)

with open('../input/sample.csv', 'r') as f:
    reader = csv.reader(f)
    for fields in reader:
        dt = datetime.strptime(fields[0], '%Y-%m-%d %H:%M:%S')
        stats[(dt.year, dt.month)] += int(fields[2])

for (year, month), total in stats.items():
    print(f'{year}{month}月: {total}')

異なる年の同じ月は別々に集計したほうがいいかと思ったので辞書のキーを (year, month) にしてみました。不要なら month にしてください。

1Like

Comments

  1. @onaka0_0suita

    Questioner

    ご回答頂き、ありがとうございます!
    まさに理想的な形で出力出来ました!
    また、ちょっとしたテクニックや、分かりやすい説明でPython初学者の私にも理解することが出来ました。
    本当にありがとうございました!

入力の例がカンマ区切りになっていませんがこれで合っていますか?

また、何が上手くいかないのか、出たエラーや間違った出力、それにコード全体も書いていただけると答えやすいです。

0Like

Comments

  1. @onaka0_0suita

    Questioner

    ご回答頂きありがとうございます。
    情報が足りておらず、失礼いたしました。
    各行にカンマ区切りになります。
    また、上手くいかない箇所やエラー等を追記いたしました。

    お手数おかけしますが、よろしくお願いいたします。

Your answer might help someone💌