質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.02%

  • Python

    5519questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    4077questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

python classとforの組み合わせ

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 152

MasaKoba

score 12

import csv
import datetime

# 辞書にデータを読み取る
date_dict = {}
with open("moving_train.csv", "r", newline="") as f:
   reader = csv.reader(f)

    for row in reader:
        date = map(int, row[0].split('/'))
        date_dict[datetime.date(*date)] = int(row[1])

class Year:
    def __init__(self, x):
        self.x = x

    def month_ave(self):
        for key in list(date_dict):
            if datetime.date(self.x, 4, 1) <= key < datetime.date(self.x, 5, 1):
                pass
            else:
                del date_dict[key]

        total = sum(date_dict.values())
        average = 1.0 * total / len(date_dict)
        print(total, average)

if __name__ == '__main__':
    year_2011 = Year(2011)
    year_2012 = Year(2012)
    year_2013 = Year(2013)
    year_2011.month_ave()
    year_2012.month_ave()
    year_2013.month_ave()

お世話になります。以下の手順で作業を行おうとしたところエラーが出ました。

(手順)
・csvから以下のようなデータを取得(データ自体は2011-2015くらいまでございます)
2011/4/1,48
2011/4/2,29
2011/4/3,28
2011/4/4,23
2011/4/5,25
・同じ月で年ごとの平均を計算(例えば、2011年の4月と2012年の4月のデータの平均を計算)

以下のようなエラーが出たのですが、もし理由がわかれば教えてほしいです。
何卒よろしくお願いいたします。

C:\Users\.....py"
710 23.666666666666668
Traceback (most recent call last):
  File "C:/Users/.....py", line 35, in <module>
    year_2012.month_ave()
  File "C:/Users/.....py", line 25, in month_ave
    average = 1.0 * total / len(date_dict)
ZeroDivisionError: float division by zero

まだ初心者で本やウェブを見ながら作っているため、トンチンカンなところもあるかと思いますが、何卒よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • GOTA77

    2017/10/16 23:43

    記載しているコードと実行しているコードが合っているでしょうか?エラーはyeが定義されていいないためのように見えます。

    キャンセル

  • MasaKoba

    2017/10/16 23:55

    皆様、貴重なご指摘ありがとうございます。少しずつ勉強していきます。お手数をおかけしますが引き続き何卒よろしくお願いいたします。

    キャンセル

  • MasaKoba

    2017/10/16 23:55

    取り急ぎ御礼までです。

    キャンセル

回答 1

checkベストアンサー

0

クラス内でインスタンス変数を参照する際には、selfを付けねばなりません。

def month_ave(self):
    for key in list(date_dict):
        if datetime.date(self.x, 4, 1) <= key < datetime.date(self.x, 5, 1):
            pass
        else:
            del date_dict[key]

    total = sum(date_dict.values())
    average = 1.0 * total / len(date_dict)
    print(total, average)

ただ、これを付けていなくても、ご提示のエラーは出ないかと思います。
実際にはこのようなエラーが出るのでは。

Traceback (most recent call last):
  File "hoge.py", line 29, in <module>
    year.month_ave()
  File "hoge.py", line 18, in month_ave
    if datetime.date(x, 4, 1) <= key < datetime.date(x, 5, 1):
NameError: name 'x' is not defined

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/16 23:58

    ありがとうございます!selfをつけると大丈夫でした!ただ、elseのときにデータを削除してしまっているため、forで2011, 2012, 2013と回した場合、2週目からはすべてデータが削除されてしまい、その結果、len(date_dict)がゼロとなり、ZeroDivisionError: float division by zeroといったエラーが出てしまいます。

    キャンセル

  • 2017/10/16 23:59

    現在、これをどうにか解決できないか検討中でございます。

    キャンセル

  • 2017/10/17 00:01

    メソッドmonth_ave内で直接date_dictを破壊的に変更しなければ大丈夫でしょう。
    ・ディープコピーしたものから要素を削除する
    ・特定の要素で新しく辞書を作る
    そのどちらかで対応できます。

    キャンセル

  • 2017/10/17 00:21

    ありがとうございます。メソッドmonth_aveの下に一行
    date_dict_x = copy.deepcopy(date_dict)
    を加えると、上手く計算できました!
    本当に助かります。ありがとうございます。(しかし、最近プログラミングを始めたのですが、プログラミングってすごく大変ですね…。。。根気よく頑張ります。。)

    キャンセル

  • 2017/10/17 00:28

    頑張ってくださいね。応援しています。
    ある程度思い通りにいじれるようになると物凄く楽しいですよ。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    5519questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    4077questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。