

## 以下のようなcsvファイルを読み取ってデータをまとめる作業を行おうと考えています。

[code]

    ダウンロードした時刻：2019/11/11 16:04:33                  
    
                    寺泊  寺泊
    年   月   日   時   風速(m/s) 風向
    
    2016    12  23  5   9.6 西
    2016    12  23  6   9.8 西
    2016    12  23  7   10.6    西
    2016    12  23  8   10.4    西
    2016    12  23  9   10.5    西
    2016    12  23  10  9.1 西
    2016    12  23  11  8.1 西北西
    2016    12  23  12  7.8 西北西
    2016    12  23  13  6.8 西北西
    2016    12  23  14  6.3 西北西
    2016    12  23  15  6.2 西北西
    2016    12  23  16  6.5 西北西
    2016    12  23  17  6.3 西北西
    2016    12  23  18  6.3 西北西
    2016    12  23  19  5.4 西北西
    2016    12  23  20  3.9 西北西
    2016    12  23  21  4   西北西
    2016    12  23  22  4.6 北西
    2016    12  23  23  4   北西
    
[/code]

* * *

まとめ方は、16方位で西・西北西・北西・北北西・北の5方位を満たす風向を対象として  
風速8m/s以上の風の値を2乗して、それらを足し合わせるといった処理をしたいと考えております。

現在、if文で風速8m/s以上かつ対象の風向で場合分けをして  
その値だけを2乗して足し合わせるところでつまずいております。

また全ての風速を2乗させて8^2=64以上の値と、対象の風向で場合分けをして  
それを満たす風速の2乗値を足し合わせたほうがよいのかなとも思っています。

現在のコードを以下に記します  
ご確認ください。

[code]

    import csv
    
    f = open("寺泊12.csv", "r")
    reader = csv.reader(f)
    next(reader); next(reader); next(reader); next(reader); next(reader)
    
    Direction = ['西','西北西','北西','北北西','北']
    
    for row in reader:
      if not row[4].strip(): # 空行スキップ
        continue
      colE = float(row[4])
      if (colE >= 8) and (row[5] in Direction):
    
[/code]


CC BY-SA 4.0
2019-12-16T03:06:33.493
61469
2019-12-16T23:11:27.867
37081
question
python csv
pythonでcsvファイルの数値処理


べき乗計算には[`**`または組み込みの`pow`関数](https://docs.python.org/ja/3.8/library/functions.html#pow)を使います。  
[`math.pow`](https://docs.python.org/ja/3/library/math.html?highlight=math%20pow#math.pow)も使えますが、上記と違って引数をfloatとして扱う点と[実数範囲外の演算で例外を出す](https://python.atelierkobato.com/power/#outline__1_3)点に注意してください。

[code]

    >>> pow(8, 2)
    64
    
    >>> 9.6 ** 2
    92.16
    
    >>> import math
    >>> math.pow(8, 2) # 引数と戻り値がfloatになっている
    64.0
    
    >>> pow(-1, 0.5) # 底が負数の平方根
    (6.123233995736766e-17+1j)
    >>> math.pow(-1, 0.5)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: math domain error
    
    >>> pow(1, 1j) # 指数が複素数
    (1+0j)
    >>> math.pow(1, 1j)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: can't convert complex to float
    
[/code]

「条件を満たす風速を2乗して足し合わせる」ための`if文`は正しい条件で書かれていますので、上記を踏まえて`colE`を2乗した値を合計するための変数に足し合わせれば目的を達成できると思います。

[code]

    import csv
    
    f = open("寺泊12.csv", "r")
    reader = csv.reader(f)
    next(reader); next(reader); next(reader); next(reader); next(reader)
    
    Direction = ['西','西北西','北西','北北西','北']
    
    sum = 0
    for row in reader:
      if not row[4].strip(): # 空行スキップ
        continue
      colE = float(row[4])
      if (colE >= 8) and (row[5] in Direction):
        sum += pow(colE, 2)
    
    print(f'風速8m/s以上の風の値を2乗して足し合わせた合計は {sum:.2f} です。')
    
[/code]


CC BY-SA 4.0
2019-12-16T23:11:27.867
61490
2019-12-16T23:11:27.867
9820
61469
answer