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

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

ただいまの
回答率

88.91%

python 風向・風速グラフの作成

解決済

回答 2

投稿 編集

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

o-fk

score 16

イメージ説明風向・風速グラフの出力を試みたのですが日時の読み込みがうまくできません。

csvデータは添付のように読み込まれています。
イメージ説明

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime

## IFILE; 入力ファイル(csv)
IFILE = '14101010.csv'
## FIGOUT; 風向・風速グラフ(pdf)
FIGOUT = 'wind2019_8.1.png'
## YEAR; 年
YEAR = 2019
## データ読み込み(csv)
infil = "14101010.csv"

df = pd.read_csv(IFILE,header=0,encoding='utf-8')

i = 0
dt = []
wd = []
while i < len(df):
    ## 時刻データをdatetime形式に変換
    ymd = df.日付[i].split('/')
    dt0 = datetime.datetime(YEAR,int(ymd[1]),int(ymd[2]),int(df.時[i]))
    dt.append(dt0)
    #print(dt0)
    ## 風向データを数値化
    wd0 = np.nan
    if df['WD'][i] == 'CALM':
        wd0 = 0.0
    elif df['WD'][i] == 'NNE':
        wd0 = 22.5
    elif df['WD'][i] == 'NE':
        wd0 = 45.0
    elif df['WD'][i] == 'ENE':
        wd0 = 67.5
    elif df['WD'][i] == 'E':
        wd0 = 90.0
    elif df['WD'][i] == 'ESE':
        wd0 = 112.5
    elif df['WD'][i] == 'SE':
        wd0 = 135.0
    elif df['WD'][i] == 'SSE':
        wd0 = 157.5
    elif df['WD'][i] == 'S':
        wd0 = 180.0
    elif df['WD'][i] == 'SSW':
        wd0 = 202.5
    elif df['WD'][i] == 'SW':
        wd0 = 225.0
    elif df['WD'][i] == 'WSW':
        wd0 = 247.5
    elif df['WD'][i] == 'W':
        wd0 = 270.0
    elif df['WD'][i] == 'WNW':
        wd0 = 292.5
    elif df['WD'][i] == 'NW':
        wd0 = 315.0
    elif df['WD'][i] == 'NNW':
        wd0 = 337.5
    elif df['WD'][i] == 'N':
        wd0 = 360.0
    wd.append(wd0)

    i += 1

df['datetime'] = dt
df['WD'] = wd


print(df)

## 風速・風向グラフ
wmax = df['WS'].max() // 1 * 1 + 1
fig3 = plt.figure(figsize=(8,5))
ax1 = fig3.subplots()
p1 = ax1.plot(df['datetime'],df['WS'],c='k',linewidth=2)
ax1.set_ylim([0,wmax])
ax1.set_title('wind:2019/8/1')
ax1.set_xlabel('Time')
ax1.set_ylabel('Wind Speed [m/s]')
ax2 = ax1.twinx()
ax2.plot(df['datetime'],df['WD'],c='w',marker='o',ms=8,mfc='b',alpha=1)
ax2.set_ylim([0,360])
ax2.set_yticks([0,45,90,135,180,225,270,315,360])
ax2.set_ylabel('Wind Direction')
fig3.savefig(FIGOUT)

エラー

dt0 = datetime.datetime(YEAR,int(ymd[1]),int(ymd[2]),int(df.時[i]))

ValueError: hour must be in 0..23
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • o-fk

    2020/07/23 12:50

    ありがとうございます。24が入っていたから動かなかったんですね。。
    因みに、手入力でcsvの24を全てゼロに変更したら図が出力されたのですが、手入力をしなくても変更できる方法はありませんか。。。わがまま言ってすみません!

    キャンセル

  • can110

    2020/07/23 13:04

    「dt0 = datetime.datetime(YEAR,int(ymd[1]),int(ymd[2]),int(df.時[i]))」を
    「dt0 = datetime.datetime(YEAR,int(ymd[1]),int(ymd[2]), int(df.時[i])%24 )」としてください。

    キャンセル

  • o-fk

    2020/07/23 13:48

    ありがとうございます!

    キャンセル

回答 2

checkベストアンサー

+1

'2019/08/01'という文字列をintにはできません。やるなら以下のような感じでしょうか。

    ymd = df.日付[i].split('/')
    dt0 = datetime.datetime(YEAR,int(ymd[1]),int(ymd[2]),int(df.時[i]))


これが通ってもまた別のエラーが出ますが、それはまた別の話で…

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/22 18:03

    試してみます!

    キャンセル

+1

DataFrameを作るところまで記述すると以下のように書けば良いと思います。

# datetime列を作成しながら読み込み
df = pd.read_csv(
    IFILE,
    header=0,
    encoding="utf-8",
    parse_dates={"datetime": ["日付", "時"]},
    date_parser=lambda x: datetime.datetime.strptime(x, "%Y/%m/%d %H"),
)

# 風向データを数値化
wd_keys = [
    "CALM", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE",
    "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW", "N",
]
wd_dict = {}
angle = 0.0
for wd_key in wd_keys:
    wd_dict[wd_key] = angle
    angle += 22.5
df.replace({"WD": wd_dict}, inplace=True)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/22 18:03

    試してみます!

    キャンセル

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

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

関連した質問

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