日付の空欄を「推測で埋める」とエラーも出ずに集計が狂う|代わりにやること5つ

淡い色の机に置かれた格子状のカードの、1マスだけが空白になっている俯瞰写真風のイラスト トレード自動化実録

日付の列に、空欄と「読めない文字」が混ざっている。とりあえず今日の日付を入れて先に進んだ。エラーは出ていないし、表も動いている。……本当に大丈夫だろうか。

大丈夫ではありません。ただし、壊れ方が静かなだけです。

⚠️ この記事の情報は2026年8月時点のものです。記事に出てくる株のシステムは相場を観測・研究するためのもので、自動発注はしません(read-only)。実際のお金での発注はしていません(仮想発注のみ・実発注なし)。ソフトの画面や仕様は変わるため、内容は随時更新します。

この記事で分かること

推測で埋めた場合と、弾いて理由を残した場合を4つの観点で比べた図
読めない日付を「埋める」か「弾く」か。違いは見た目ではなく、あとから追えるかどうかに出る。

あなたが今やろうとしているのは「欠けている日付を、手元にある一番それらしい日付で埋める」作業です。今日の日付、ファイルの更新日時、前の行と同じ日付。どれも親切心から出てきます。そして、どれも、あとから元に戻すのが難しくなります。

  • 「埋めた日付」が並べ替え・最新判定・期間集計をどう狂わせるか(エラーが出ない理由つき)
  • 推測で埋めてはいけない4つのパターン(実際に禁止として明文化したもの)
  • 埋める代わりの型「弾いて、理由を残す」の作り方(Excelの列を1つ足すだけ)

結論を先に置きます。読めない日付は埋めずに弾く。そして「なぜ使えなかったか」を残す。これだけです。埋めた瞬間、その行は「正しく見える間違い」に変わり、その後は疑いの目が向きにくくなります。弾いておけば、少なくとも自分で気づけます。

【早見表】この症状が出たら、まずここを見る

心当たりのある行から読んでください。上から順に読む必要はありません。

症状まず見る場所
並べ替えたのに順番が想定と違う日付列に「日付」と「文字列」が混ざっていないか(左寄せ・右寄せの違いで見分ける)
「最新のデータ」が思っていたものと違う未来の日付が紛れていないか。未来の行はたいてい最新の座を奪う
月をまたぐと合計が合わない空欄を今日の日付で埋めていないか。埋めた行は全部「今月」に入る
同じ内容が別の月に二重で出るファイルを作り直した日や保存し直した日を、データの日付として使っていないか
日付だけの列なのに時刻の比較で結果が変わる読み込み時に「その日の0時」が自動で足されていないか
どこで狂ったのか追いかけられない除外の理由を書いた列があるか。無ければ、まずその列を作る

エラーが出ないから、静かに狂う

日付の取り違えが厄介なのは、失敗が失敗の顔をしないからです。

ファイルが開けないなら気づきます。数式が壊れれば赤い文字が出ます。ところが「日付を埋める」は、全部の行がきれいに揃った表を作ります。合計も出る。グラフも描ける。見た目は、むしろ埋める前より整っています。

そして、狂う方向にも偏りがあります。

筆者が自分のシステムでこの判定を検証用データで再現してみたとき、再現した6件は、いずれも「結果を良く見せる」側に倒れていました。具体的には、こうです。結果を見たあとに登録した記録が、事前に登録したものと判定されました学習に使った期間と、答え合わせに使う期間の重なりが、重なっていないものと判定されました。どちらも、成績が実際より良く出ます。

偶然ではありません。「読めないものを黙って通す」処理は、通した値を有効なデータとして扱います。有効なデータとして通ってしまえば、その行はもう検査の対象から外れる。埋めるという行為は、判定を甘い側へずらす作業だったわけです。

「文字の順番」と「時刻の順番」は違う

ひとつだけ、数字の例を出します。世界標準時の 00:30 は、日本時間の 09:30 にあたります。日本は世界標準時より9時間先に進んでいるので、同じ一瞬でも書き方が9時間ずれる、というだけの話です。

ここで、同じ表に日本時間の 09:00 の行があったとします。文字として並べれば 00:30 のほうが前に来ます。けれど実際の時刻では、00:30 の行のほうが30分あとです。

文字列として並べ替えると、この2つは逆順になります。しかも、逆順になったことを誰も教えてくれません。時差そのものの扱いは深追いしませんが、CSVの時刻でここに引っかかった経緯は関連記事に置いてあります。

推測で埋めない — 決めた4つの禁止

日付の推測を禁止する4項目を2列4マスに整理した図
日付・時刻を読む部品に書いた「絶対にしないこと」のうち4つ。

CSVの時刻でつまずいたのに続いて二度目だったので、日付と時刻を読む部品を1つにまとめ、そこに「絶対にしないこと」を書き並べました。コメントとして書いてあるだけではなく、その通りに動く形にしてあります。以下は、そのうち読者に関係が深い4つです。

  1. タイムゾーンの無い時刻を、勝手に補完しない。 動かしている機械のタイムゾーンにも、世界標準時にも当てはめない。当てはめた時点で、指している実時刻が変わってしまうからです。
  2. 読めない値を推測しない。 とくに「ファイルの更新日時」と「今の時計」で代用しない。この2つは、データそのものとは何の関係もありません。
  3. 日付だけの値を「その日の0時」へ勝手に格上げしない。 「その日のどこか」でしかない情報を、点の時刻に変えると、比較の結果が変わります。
  4. 日時と日付を黙って混ぜない。 読み取りの部品(プログラムでいう関数。Excelの関数とは別物です)を2本に分けました。呼ぶ側が「今どちらを扱っているか」を意識せざるを得ない形にするためです。

4つとも、便利さを削る決定です。今まで通っていた値が通らなくなる。実際、この変更を入れた直後は、これまで通っていた古いテスト用データが「日付だけ」の書き方のせいで読めなくなり、6件を書き直すことになりました。それでいい、と判断しました。新しく壊れたのではなく、今まで見えていなかっただけだからです。

埋める代わりに「弾いて、理由を残す」

禁止だけ決めても、現場は回りません。「じゃあ空欄はどうするのか」に答えが要ります。

採った型は、理由を付けて弾くでした。ただ捨てるのではなく、なぜ使えなかったかを一緒に残す。用意した理由は4種類です。

  • 値が無い(空欄・そもそも列に何も入っていない)
  • 読めない(日付として解釈できない文字が入っている)
  • タイムゾーンが無い(時刻はあるが、どこの時刻か書かれていない)
  • 日付として読めない(決めた書式から外れている)

この4つを分けたのが効きました。「なんか弾かれた」と「タイムゾーンが書かれていないから弾かれた」では、翌日の自分にとって価値がまるで違います。前者は調査が振り出しに戻る。後者は、直す場所が一行で分かります。

迷ったら止める側へ倒す

その6日後、もう一段厳しくしています。同じ部品を、別の場所(銘柄の入手時刻を見る処理)にも使わせたうえで、未来の日付や読めない日付が来たときに、通さずに止める形へ変えました。安全側で止まる設計を、英語では fail closed(フェイルクローズド)と呼びます。

理由は単純です。読めないものを黙って通すと、その行が「使ってよい有効なデータ」の側に分類されてしまうから。実際に起きたのは、未来の日付や壊れた文字が「もう手に入っていたデータ」として扱われ、まだ知りえないはずの情報で判断していた、という形でした。止めれば、その日の処理は空振りします。空振りは痛い。でも、間違った答えが出てくるよりはるかに安いと判断しました。

この作業の途中で、思わぬ副産物もありました。厳しくした結果、実は毎日ずっと「タイムゾーンの無い時刻」を送り込んでいた場所が見つかったのです。ゆるい判定のままなら、たぶん一生気づきませんでした。

Excel・CSVで今日からできるチェック5つ

元ファイルをコピーし、理由列を足し、フィルターで理由列が空の行だけを集計する3ステップの図
元の表を書き換えずに済ませる、集計前の3手順。並べ替えも上書きもしない。

プログラムを書かない人向けに、同じ考え方を手作業へ翻訳します。各項目はそれ単体で完結しています。気になったものだけ拾ってください。

この節の作業は、必ず元ファイルをコピーしてから、コピーのほうで試してください。元のファイルは触らないでおきます。表を直接いじる手順は、途中で手が滑ったときに元へ戻せなくなるからです。

1. 空欄を今日の日付で埋めない

空欄は「日付が不明」という情報を持っています。今日の日付を入れた瞬間、その情報が消え、代わりに「今月のデータ」という嘘が入ります。月次集計をしているなら、埋めた行はすべて今月に流れ込みます。空欄のままにするか、その行を別シートへコピーしたうえで、元の行には次に出てくる「理由の列」で印を付けてください。元の行そのものは消しません。

2. ファイルの更新日時をデータの日付として使わない

更新日時は「そのファイルに最後に触った時刻」であって、中身が起きた時刻ではありません。開いて閉じただけで変わることもあります。コピーしても更新日時はそのまま引き継がれる一方、作成日時のほうは「コピーした日」に書き換わります。どちらもファイルの取り扱いで決まる時刻であって、中身の出来事が起きた時刻とは無関係です。zipを展開したり、別のツールで転送したりすると、さらに別の時刻に化けることもあります。データの日付として使ってよい根拠が、どこにもありません。

3. 日付だけの列に、時刻を足さない

「日付だけ」の列に 0:00 を足すと、その日の一番早い時刻になります。同じ日の他の記録より前に来る、という順番が勝手に生まれます。もともとの表に、その順番を決める根拠はありませんでした。日付だけの列は、日付だけで比べる。時刻が必要なら、時刻の列を別に作ってください。

4. 未来の日付が混ざっていないか、先に見る

集計する前に、日付列の空いているセルへ =MAX(日付列の範囲) と入れて、出てきた日付が今日より先でないかを見る。1つのセルで済み、元の表には一切触りません。今日より先の日付が出てきたら、打ち間違いか、年の桁のずれか、書式の誤解のどれかです。未来の行は「最新」として扱われやすく、しかも見た目には何の異常もありません。この1セルの確認を、集計前の儀式にしてしまうのが早いです。

並べ替えで確かめたいときは、表の中のセルを1つだけ選んでから並べ替えるか、必ず表全体を選んでください。日付列だけを選んで並べ替えると、日付と他の列の行の対応がバラバラになります。エラーは出ず、見た目も普通のままで、保存して閉じたあとは元に戻せません。

5. 埋める代わりに「なぜ使えないか」の列を1つ足す

右端に列を1つ足して、「空欄」「読めない」「書式ちがい」などと書いておく。集計では、その列が空の行だけを対象にします。やり方はかんたんで、データフィルター を押し、理由列の▼から「空白セル」だけにチェックを入れると、使える行だけが表示されます。合計を式で出したいなら =SUMIFS(金額列, 理由列, "") のように、理由列が空の行だけを足す形にします。

まずは、除外した行が消えずに残り、あとから件数を数えられるようになります。除外が多すぎるときにも気づけます。埋める作業より手間が増えにくく、元の値を失わずに済みます。ただし列を足すと、既存の集計範囲やピボットテーブルの参照がずれることがあるので、コピーで試してから本番のファイルに反映してください。

非エンジニアが得た教訓

データを扱っていて一番怖いのは、動かないことではありませんでした。動いてしまうことです。

止まってくれるトラブルは、その場で直せます。困るのは、こちらの善意で埋めた一マスが、表全体の意味を静かに書き換えてしまう種類のものです。エラーが出ない分、発見が半年後になったりします。

それと、「分からない」を残す勇気。空欄は敗北ではなく、正直な記録です。分からないものを分からないまま持ち歩けるかどうかが、表の信頼度を決めていました。きれいに埋まった表より、穴が開いていて理由が書いてある表のほうが、あとで役に立ちます。

最後にひとつ。判定を厳しくすると、短期的には手戻りが増えます。今まで通っていたものが通らなくなるからです。それでも、通らなくなった件数は「新しく壊れた数」ではなく「今まで見えていなかった数」でした。この読み替えができるかどうかで、厳しくする決断のしやすさが変わります。

まとめ

読めない日付は、埋めない。弾いて、理由を残す。

やってはいけないのは、タイムゾーンの無い時刻を勝手に補完すること、ファイルの更新日時や今の時計で代用すること、日付だけの値を0時へ格上げすること、日時と日付を混ぜること。この4つです。代わりに「値が無い/読めない/タイムゾーンが無い/日付として読めない」を書き分けておけば、直す場所が後から特定できます。

Excelなら、コピーしたファイルの右端に理由の列を1つ足すところから。集計前に =MAX で一番新しい日付を出し、今日より先が混ざっていないか確かめるところから。どちらも今日、数分で始められます。埋めたくなったときこそ、手を止める合図です。


関連記事

無料テンプレート配布のお知らせ

非エンジニアの自動化ラボ メルマガ 読者登録フォーム

Claude Codeを安全・便利に使うための設定テンプレート(CLAUDE.md)を無料配布しています。メールアドレスをご登録いただくと、すぐにダウンロードリンクをお送りします。


免責事項

本記事は執筆時点(2026年8月)の情報に基づく、筆者個人の体験の記録です。記事中の自動売買システムに関する記述は、特定の投資手法や自動売買の利用を推奨するものではありません。投資には元本割れのリスクがあり、最終的な判断はご自身の責任で行ってください。また、本記事ではセキュリティに関わる話題に触れていますが、悪用防止の観点から、具体的な脆弱性や攻撃手法の詳細は記載していません。AIツールの仕様は予告なく変更される場合があります。最新情報は各公式ドキュメントをご確認ください。本記事の内容を用いて生じたいかなる損害についても、筆者は責任を負いかねます。

コメント

タイトルとURLをコピーしました