ホームページ > バックエンド開発 > Golang > int96 Parquet タイムスタンプを Go の time.Time に変換するにはどうすればよいですか?

int96 Parquet タイムスタンプを Go の time.Time に変換するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-31 21:57:10
オリジナル
832 人が閲覧しました

How to Convert an int96 Parquet Timestamp to Go's time.Time?

Parquet から Go への int96 タイムスタンプのキャスト

はじめに

Parquet ファイルに格納されたタイムスタンプを操作する場合、int96 として表されるデータに遭遇するのが一般的です。データ型。この 12 バイト形式は、タイムスタンプと日付部分で構成されます。この int96 タイムスタンプを Go のタイムスタンプにキャストする方法を理解することは、データの操作と分析にとって非常に重要です。

int96 タイムスタンプのデコード

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].

  • 時間 (ナノ秒): 最初の 8 バイトを反転すると、0x60FD4B3229000059682500 が得られます。これは、次のようになります。 45296秒(つまり、12 時間 34 分 56 秒)。
  • 日付 (ユリウス日番号): 最後の 4 バイトを反転すると、0x00256859 が得られ、ユリウス日番号 2451545 に対応します。これは、ユリウス日番号 2451545 に対応します。 2000-01-01.

Golang コードの実装

デコード プロセスを示す 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート