使用儲存在parquet 檔案中的時間戳時,通常會遇到表示為int96 的資料資料型態。此 12 位元組格式由時間戳記和日期部分組成。了解如何將這個 int96 時間戳轉換為 Go 中的時間戳對於資料操作和分析至關重要。
解碼 int96 時間戳記的關鍵在於辨識其結構。前八個位元組表示以奈秒為單位的時間戳,但以相反的位元組順序儲存。
time_nano = ReverseBytes((timestamp[0:8]))
其餘四個位元組表示以儒略日數表示的日期。
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中文網其他相關文章!