ホームページ >バックエンド開発 >Golang >時間範囲内で配列の要素を正規化するにはどうすればよいですか?

時間範囲内で配列の要素を正規化するにはどうすればよいですか?

PHPz
PHPz転載
2024-02-08 21:30:35808ブラウズ

時間範囲内で配列の要素を正規化するにはどうすればよいですか?

php エディタ Xinyi では、時間範囲内で配列の要素を標準化する方法を紹介します。開発では、時系列データを処理する必要があることがよくありますが、これらのデータにはタイムジャンプや欠落状況が発生する可能性があります。データの正確さと完全性を保証するには、配列内の要素を標準化する必要があります。正規化では、配列の要素を時系列順に配置し、欠落している時点を埋めます。以下では、この機能を実装する方法について詳しく説明します。

質問内容

時間範囲内の要素の配列を正規化しようとしています。 2022 年 1 月 1 日に発生した 20 件の銀行取引があるとします

リーリー

発生日以外のデータはありませんが、それでも 1 日のうちの時間を割り当てたいので、最終的には次のようになります:

リーリー

Go には、要素の配列内のインデックスの時刻の正規化を計算しようとする関数があります。

リーリー

しかし、誤って 2022/1/1 00:00 から 2022/1/1 23:59 までの時間範囲の 4 要素配列のインデックス 0 で 2022/1/1 05:59 を計算してしまいました。逆に2022/1/1 00:00を見たいです。このような条件下で正しく動作するのはインデックス 3 だけです。

それでは、正規化の何が間違っているのでしょうか?

###編集:###

これは @icza

によって修正された機能です リーリー

これは例です: 開始日と終了日が

2022/01/01 00:00

- 2022/01/01 00:03 であると仮定すると、銀行取引配列は次のようになります。には 3 つのエントリがあり、トランザクション番号 3 (配列内の 2) の正規化された時刻を取得したいとします。 リーリー 開始時刻と終了時刻の間 (00:00

から

00:03 まで) が 4 分しかないため、配列 (サイズ 3##) を見つけたいと考えています。 #) の最後のエントリ (インデックス 2) の正規化された時間、結果は次のようになります: リーリー または範囲内の最後の分 (00:03)。

これは再現可能な例です: https://go.dev/play/p/ezwkqanv1at回避策

n

ポイント間に

n があります-1

セグメント。これは、補間に startend を含める場合、期間の数 (つまり delta) は arraysize - 1# であることを意味します。 ## 。 さらに、 index1

を追加した場合、結果は

start にはなりません ( 00:00 はスキップされます)。 したがって、正しいアルゴリズムは次のとおりです: リーリー 遊び場に行ってで試してみましょう。

また、大量のトランザクション (1 日の分ごとに並べられたもの、約 1,000 件) がある場合、同じタイムスタンプ (同じ時と分) を持つ複数のトランザクションが簡単に発生する可能性があることに注意してください。これを回避したい場合は、秒やミリ秒など、分より小さい精度を使用してください。 リーリー

はい、これにより、タイムスタンプの秒数が必ずしもゼロになるわけではありませんが、トランザクション量が多いほど、異なる一意のタイムスタンプを持つことが保証されます。

トランザクションが 1 日の秒単位 (つまり 86400) である場合、この「単位」を完全に削除し、time.duration

自体 (つまり ナノ秒) を使用できます。これにより、最大数のトランザクションであってもタイムスタンプの一意性が保証されます:

リーリー

これを 100 万トランザクションでテストしています。最初の 15 時間部分は次のとおりです (遅延しているのは 2 番目の部分だけです):

リーリー

これを

遊び場に行って 試してみてください。

以上が時間範囲内で配列の要素を正規化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。