Parquet ファイルに格納されたタイムスタンプを操作する場合、int96 として表されるデータに遭遇するのが一般的です。データ型。この 12 バイト形式は、タイムスタンプと日付部分で構成されます。この int96 タイムスタンプを Go のタイムスタンプにキャストする方法を理解することは、データの操作と分析にとって非常に重要です。
int96 タイムスタンプをデコードする鍵は、その構造を認識することにあります。最初の 8 バイトはタイムスタンプをナノ秒で表しますが、逆のバイト順で保存されます。
time_nano = ReverseBytes((timestamp[0:8]))
残りの 4 バイトは日付をユリウス日の数値で表します。
julian_day = ReverseBytes((timestamp[8:12]))
次の int96 タイムスタンプを考慮します: [128, 76, 69, 116, 64, 7, 0, 0, 48, 131, 37, 0].
デコード プロセスを示す Go コード スニペットは次のとおりです。
package main import ( "fmt" "math" ) func main() { // Sample int96 timestamp timestamp := []byte{128, 76, 69, 116, 64, 7, 0, 0, 48, 131, 37, 0} // Reverse the first 8 bytes for time (nanoseconds) timeNano := reverseBytes(timestamp[0:8]) // Reverse the last 4 bytes for date (Julian day number) julianDay := reverseBytes(timestamp[8:12]) // Convert timestamp nanoseconds to seconds seconds := float64(timeNano) / math.Pow(10, 9) // Calculate the timestamp t := time.Unix(int64(seconds), 0) // Create a new time object with date set from Julian day number t = t.AddDate(int(julianDay/365.25-2440587.5), 0, int(julianDay%365.25)) fmt.Println(t) } func reverseBytes(bytes []byte) uint64 { var result uint64 for _, v := range bytes { result = result << 8 | uint64(v) } return result }
以上がint96 Parquet タイムスタンプを Go の time.Time に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。