前提知識(国土交通省)

1年間の日平均水位に欠測がない場合には、位況は正常値として扱う。 1年間の日平均水位の欠測日が10日以下である場合には、欠測でない期間の日平均水位から位況を求め、これらを推定値として扱う。なお、この場合の位況の算出は、欠測がないとしたときの豊水位、平水位、低水位および渇水位のそれぞれの順位と当該1年間の総日数の日を当該1年間の総日数から欠測を除いた日数に乗じた順位(少数1位を切り捨てる。)による。

検証データ

303031283303010、水位(S)、2020年1月 ~ 2021年12月 を入力 日データと時間データ量データを取得する。./water_info に対象ファイルを格納2種

Excel構造と読込み方針

  • サンプル: water_info/303031283303010_木原_2020年1月-2021年12月_WD.xlsx(日データ), ..._WH.xlsx(時間データ)
  • シート構成: 全期間 / 2020年 / 2021年(WHのみ summary も存在)
  • 全期間シート
  • 日: 列は datetime, 水位。ヘッダー1行のみ。usecols=[0,1], header=0 でそのまま取得。
  • 時間: 列は display_dt, 水位。同様に usecols=[0,1], header=0 で取得。
  • 年シート
  • 日: 2020年 など。A,B列がデータ列(datetime, 水位)、C列以降に統計セルが混在するため usecols=[0,1] で取得すること。
  • 時間: A,B列のみ(統計列なし)。同じく usecols=[0,1] で取得。
  • 年シートが複数ある場合はすべて読み込み concat して1本のDataFrameにまとめ、日時順にソート。
  • summaryシート: WHのみに存在。読み込み対象外。
  • 読み込み優先順位: "全期間" シートがあればそれを採用。無い場合は ^\d{4}年$ のシートを全て読み込み結合。
  • 列名正規化の例: 時刻列を datetime に、値列を value などにリネームする場合は読み込み直後に rename で吸収。
  • 列名ゆらぎの考慮: 時間データでは日時列が display_dt、日データでは datetime。値列はモードにより 水位/流量/雨量 となる。読み込み時は 1) A列を日時列として扱う(display_dt または datetime が候補)。 2) B列を値列として扱う(水位/流量/雨量 などラベル差はそのままでも良いが、内部処理では共通名にリネーム可能)。 3) ラベルが欠落していても先頭2列で強制的に読み込み、必要に応じてリネームする方針とする。

集計要件(時間データ -> 日平均)

  • 対象: 時間データ(_H系。例: WH=水位1時間、QH=流量1時間、RH=雨量1時間)。日時列はdisplay_dt(読み込み後はdatetime型へ正規化)。
  • 日の定義: 1:00~0:00 を1日とみなす。キー用に hydro_date = (display_dt - 1時間).date() を作り、この日付でグループ化する。
  • 平均の2種類を計算
  • 可変分母平均: 非NaNの本数で割る(その日ごとに分母が変わる)。
  • 分母固定平均: 1日が24本すべて埋まっている場合のみ平均値を算出し、24本未満なら None/NaN を返す。

マージ方針(時間->日集計と日データ)

  • 日付基準: 時間データを1日集計した hydro_date(= display_dt -1h の date)リストを基準とする。
  • マージ: 日データ(WD/QD/RD)は外部結合で取り込み、該当日が無い場合はNaNのまま保持。
  • 結果列イメージ(4列): date, hourly_daily_avg_var_den(可変分母平均), hourly_daily_avg_fixed_den(24本揃いのみ), daily_value(日データ値)。

ランク付与要件

  • 対象列: 上記3列(可変分母平均・分母固定平均・日データ値)。元の値列は保持し、ランクは専用列を追加する(例: rank_var_den, rank_fixed_den, rank_daily_value)。
  • 単位期間: 1年単位で処理し、結果を元データに結合する。
  • 欠損閾値: その列の1年内にNone/NaNが11個以上ある場合、その年の同列ランクは全てNoneとする(ランク付けを行わない)。
  • 欠損が閾値未満の場合:
  • 非欠損は値の降順でユニークランク(最大値がランク1)。重複値もユニークなランク番号を付与(値降順->インデックス順などで連番)。
  • 欠損もユニークランクを付与する。付与順は日付昇順で連番を振り、非欠損の次のランク番号から継続。
  • 出力列(例): date, hourly_daily_avg_var_den, hourly_daily_avg_fixed_den, daily_value, rank_var_den, rank_fixed_den, rank_daily_value を最低限用意する。
  • うるう年対応: 年単位で処理する際は対象年の日数(365/366)に基づき、順位付けや欠損閾値判定を行う(例: 分母固定平均で24本*日数を期待するかどうかなど、年日数を意識する)。

位況算出要件

  • 基準順位(平年365日をベースにした資料値): 豊水位=95位、平水位=185位、低水位=275位、渇水位=355位。
  • うるう年対応: 上記順位を365日で割った比率を使い、対象年の総日数(365 or 366)に掛けて床関数で求める(例: 豊水位比約95/365 約0.2603 -> 366日なら95~96位相当)。
  • 欠測対応:
  • 欠測0日: 調整後順位をそのまま使用。
  • 欠測が10日以下: 調整後順位 r を r_adj = floor(r * 有効日数 / 総日数) で補正して使用。
  • 欠測が11日以上: 位況は算出しない(None)。
  • 抽出方法: 日平均水位を降順にソートし、調整後順位の値をそれぞれ豊水位・平水位・低水位・渇水位として採用する。

日データと時間データのリンク設計

  • 共通キー: hydro_date(= display_dt -1h の date)を基準に、日次集計テーブルと元の時間データを紐づける。
  • 追加集計の例: 時間データ側で日別の最大/最小/平均/本数を出しておくと、位況やランク上位の日に対し「その日の時間内ピーク(時刻・値)」をすぐ引ける。
  • 参照運用: 例えば豊水位(位況/ランク上位)の日を特定したら、同じdateで時間データをフィルタして最高水位・時刻を確認できるようにする。