前提知識(国土交通省)¶
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で時間データをフィルタして最高水位・時刻を確認できるようにする。