石手川ダムのリアルタイムダム諸量一覧表でpandas練習

!pip install lxml

import pandas as pd
import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup

# 石手川ダムのリアルタイムダム諸量一覧表
url = 'http://www1.river.go.jp/cgi-bin/DspDamData.exe?ID=1368080150020&KIND=3&PAGE=0'

headers = {
    'User-Agent':
    'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko'
}

r = requests.get(url, headers=headers)

if r.status_code == requests.codes.ok:

    soup = BeautifulSoup(r.content, 'html.parser')

    # ページからデータのリンク先URLを取得
    link = urljoin(url, soup.select_one('body > center > p > a').get('href'))
    print(link)


    # データーフレームに読み込み
    df = pd.read_csv(
        link,
        skiprows=9,
        encoding='shift_jis',
        names=[
            '年月日', '時刻', '流域平均雨量', '流域平均雨量属性', '貯水量', '貯水量属性', '流入量', '流入量属性',
            '放流量', '放流量属性', '貯水率', '貯水率属性'],
        parse_dates={'日時':['年月日', '時刻']},
        index_col=['日時'],
        # 貯水率が0の時は欠損にする
        na_values=0
    )
    # df['日時']=pd.to_datetime(df['日時'], format='%Y/%m/%d %H:%M')
    # 日時と貯水率以外は削除
    df.drop(['流域平均雨量', '流域平均雨量属性', '貯水量', '貯水量属性', '流入量', '流入量属性', '放流量', '放流量属性', '貯水率属性'], axis=1, inplace=True)

# データ確認
df
df.plot()

# 欠損部チェック
df[df.isnull().any(axis=1)]

# 欠損部補完(前の値で置き換え)
dfh = df.fillna(method='ffill')
dfh.plot()

df.dtypes

type(df.index[0])

わからない

  1. 年月日と時刻を結合して日時を作成できたがdatetimeにならない
  2. 欠測、未受信の場合の欠損値の補完
    • 正常値の属性は半角スペース
    • 欠測は属性全部が$
    • 未受信の場合流域平均雨量属性は-でそれ以外の属性は#
    • 半角スペース以外の時は欠損値を上から補完
!pip install lxml

import pandas as pd
import datetime

import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup

# 早明浦ダムのリアルタイムダム諸量一覧表
url = 'http://www1.river.go.jp/cgi-bin/DspDamData.exe?ID=1368080700010&KIND=3&PAGE=0'

headers = {
    'User-Agent':
    'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko'
}

r = requests.get(url, headers=headers)

if r.status_code == requests.codes.ok:

    soup = BeautifulSoup(r.content, 'html.parser')

    # ページからデータのリンク先URLを取得
    link = urljoin(url, soup.select_one('body > center > p > a').get('href'))
    print(link)


    # データーフレームに読み込み
    df = pd.read_csv(
        link,
        skiprows=9,
        encoding='shift_jis',
        names=[
            '年月日', '時刻', '流域平均雨量', '流域平均雨量属性', '貯水量', '貯水量属性', '流入量', '流入量属性',
            '放流量', '放流量属性', '貯水率', '貯水率属性'],
        parse_dates=['年月日'],
        # na_values=0
    )


def conv(temp):
    H, M = map(int, temp.split(':'))
    return datetime.timedelta(hours=H, minutes=M)


df['日時'] = df['年月日'] + df['時刻'].apply(conv)
df.set_index('日時', inplace=True)

df.dtypes

df.head(10)

# 属性が欠測、未受信の場合は欠損値にする 
df['流域平均雨量'] = df['流域平均雨量'].where(df['流域平均雨量属性'] == ' ')
df['貯水量'] = df['貯水量'].where(df['貯水量属性'] == ' ')
df['流入量'] = df['流入量'].where(df['流入量属性'] == ' ')
df['放流量'] = df['放流量'].where(df['放流量属性'] == ' ')
df['貯水率'] = df['貯水率'].where(df['貯水率属性'] == ' ')

# 貯水率のみにする
rate_se = df.loc[:, '貯水率']
rate_se.head(10)

# 欠損値のカウント
rate_se.isnull().sum()

# 欠損部チェック
rate_se[rate_se.isnull()]

# グラフ表示
rate_se.plot()

# 欠損値補完(前の値で置き換え)
rate_correct = rate_se.fillna(method='ffill')

# 欠損値補完(後の値で置き換え)
rate_correct = rate_se.fillna(method='bfill')
rate_correct

# グラフ表示
rate_correct.plot()

# 1時間毎に変更
rato_hour = rate_correct.asfreq(freq='H')
rato_hour

# グラフ表示
rato_hour.plot()

# 欠損値を除去
rate_del = rate_se.dropna()
rate_del.plot()