Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk menormalkan elemen tatasusunan dalam julat masa?
editor php Xinyi memperkenalkan anda cara menyeragamkan elemen tatasusunan dalam julat masa. Dalam pembangunan, kami selalunya perlu memproses data siri masa, dan data ini mungkin mempunyai lonjakan masa atau situasi yang hilang. Untuk memastikan ketepatan dan kesempurnaan data, kita perlu menyeragamkan elemen dalam tatasusunan. Normalisasi meletakkan elemen tatasusunan dalam susunan kronologi dan mengisi titik masa yang hilang. Di bawah, kami akan memperincikan cara melaksanakan ciri ini.
Saya cuba menormalkan susunan elemen dalam julat masa. Katakan anda mempunyai 20 transaksi bank yang berlaku pada 1 Januari 2022
transaction 1 - 2022/01/01 transaction 2 - 2022/01/01 ... transaction 20 - 2022/01/01
Kami tidak mempunyai data selain daripada tarikh ia berlaku, tetapi kami masih mahu memberikannya satu jam dalam sehari, jadi mereka akhirnya menjadi:
transaction 1 - 2022/01/01 00:00 transaction 2 - 2022/01/01 ??:?? ... transaction 20 - 2022/01/01 23:59
In go saya mempunyai fungsi yang cuba mengira normalisasi masa dalam sehari untuk indeks dalam susunan elemen:
func normal(start, end time.time, arraysize, index float64) time.time { delta := end.sub(start) minutes := delta.minutes() duration := minutes * ((index+1) / arraysize) return start.add(time.duration(duration) * time.minute) }
Walau bagaimanapun, saya secara tidak sengaja mengira 2022/1/1 05:59 pada indeks 0 dalam tatasusunan 4 elemen dalam julat masa dari 2022/1/1 00:00 hingga 2022/1/1 23:59, sebaliknya, saya menjangkakan Lihat 1/1/2022 00:00. Satu-satunya yang berfungsi dengan betul di bawah syarat ini ialah indeks 3.
Jadi, apa yang saya buat salah dengan normalisasi?
Ini adalah fungsi yang ditetapkan oleh @icza
func timeindex(min, max time.time, entries, position float64) time.time { delta := max.sub(min) minutes := delta.minutes() if position < 0 { position = 0 } duration := (minutes * (position / (entries - 1))) return min.add(time.duration(duration) * time.minute) }
Ini contoh: Katakan tarikh mula dan tamat kami ialah 2022/01/01 00:00
- 2022/01/01 00:03
,我们的银行交易数组中有 3 个条目,我们希望获取第 3 号交易的标准化时间(数组中的 2
):
result := timeindex(time.date(2022, time.january, 1, 0, 0, 0, 0, time.utc), time.date(2022, time.january, 1, 0, 3, 0, 0, time.utc), 3, 2)
Memandangkan hanya ada 4 minit masa normal (dari 00:00
到 00:03
),并且想要查找数组(大小 3
)中最后一个条目(索引 2
) antara masa mula dan masa tamat, keputusannya ialah:
fmt.Printf("%t", result.Equal(time.Date(2022, time.January, 1, 0, 3, 0, 0, time.UTC)) // prints "true"
atau minit terakhir dalam julat, iaitu 00:03
.
Berikut ialah contoh yang boleh dihasilkan semula: https://go.dev/play/p/ezwkqanv1at
ada dalam n
点之间有 n-1
段。这意味着,如果您想在插值中包含 start
和 end
,则时间段数(即 delta
)为 arraysize - 1
.
Juga, jika mahu 1
添加到 index
,则结果不可能是 start
(您将跳过 00:00
).
Jadi algoritma yang betul ialah ini:
func normal(start, end time.time, arraysize, index float64) time.time { minutes := end.sub(start).minutes() duration := minutes * (index / (arraysize - 1)) return start.add(time.duration(duration) * time.minute) }
Cubalah di pergi taman permainan.
Juga ambil perhatian bahawa jika anda mempunyai banyak transaksi (dipesan mengikut minit sehari, kira-kira seribu) anda boleh dengan mudah berakhir dengan berbilang transaksi dengan cap masa yang sama (jam dan minit yang sama). Jika anda ingin mengelakkan perkara ini, gunakan ketepatan yang lebih kecil daripada minit, seperti saat atau milisaat:
func normal(start, end time.time, arraysize, index float64) time.time { sec := end.sub(start).seconds() duration := sec * (index / (arraysize - 1)) return start.add(time.duration(duration) * time.second) }
Ya, ini akan menghasilkan detik cap masa yang tidak semestinya sifar sama ada, tetapi akan memastikan volum transaksi yang lebih tinggi mempunyai cap masa yang berbeza dan unik.
Jika transaksi anda mengikut urutan saat sehari (iaitu 86400), maka anda boleh mengalih keluar "unit" ini sepenuhnya dan menggunakan time.duration
itu sendiri (iaitu nanosaat). Ini akan menjamin keunikan cap masa walaupun untuk jumlah transaksi terbesar:
func normal(start, end time.time, arraysize, index float64) time.time { delta := float64(end.sub(start)) duration := delta * (index / (arraysize - 1)) return start.add(time.duration(duration)) }
Menguji ini dengan 1 juta urus niaga, berikut ialah 15 bahagian masa pertama (ia hanya ditangguhkan dalam bahagian subsaat):
0 - 00:00:00.00000 1 - 00:00:00.08634 2 - 00:00:00.17268 3 - 00:00:00.25902 4 - 00:00:00.34536 5 - 00:00:00.43170 6 - 00:00:00.51804 7 - 00:00:00.60438 8 - 00:00:00.69072 9 - 00:00:00.77706 10 - 00:00:00.86340 11 - 00:00:00.94974 12 - 00:00:01.03608 13 - 00:00:01.12242 14 - 00:00:01.20876 15 - 00:00:01.29510 16 - 00:00:01.38144 17 - 00:00:01.46778 18 - 00:00:01.55412 19 - 00:00:01.64046
Cuba ini di pergi taman permainan.
Atas ialah kandungan terperinci Bagaimana untuk menormalkan elemen tatasusunan dalam julat masa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!