UNIX timestamp

まとめ

  • UNIX timestampのtimezoneはなにも指定しないとマシン設定
  • UNIXはミリ秒まで含んだ13桁のときがあるので注意。1000で割って10桁にするとdatetimeへ変換可能。

本文

UNIX timestampをちょっとだけまとめ。

PythonでUNIX時間(エポック秒)と日時datetimeを相互変換 | note.nkmk.me

datetime.datetime.fromtimestampは実行環境によってtimezoneが変わるみたいなので、timezoneは指定しておいた方が無難そう。どのtimezoneに指定するかは触っているデータによって変わる気が。日本人ユーザーの消費行動ならJSTに合わせた方がいいし、外国ならその地の時間に合わせた方がよさそう。今回私が回しているkaggleの環境設定はUTCでした。

print(datetime.datetime.fromtimestamp(0)) # machineの標準設定
print(datetime.datetime.fromtimestamp(0, datetime.timezone.utc)) # timezone 指定
print(datetime.datetime.fromtimestamp(0, datetime.timezone(datetime.timedelta(hours= 9))))

変換自体は余裕だと思ったらミリ秒まで含む含まないで10桁or13桁の2種類あるみたいです。これはフェイントですね。

timestamp(13桁)カラムをDateTime型に変換したい

  • 13桁のまま突っ込む場合(エラー)
%%time
a = train.iloc[0, 2]
print(a)
print(datetime.datetime.fromtimestamp(a, datetime.timezone.utc))

1659304800025

ValueError Traceback (most recent call last) in

ValueError: year 54551 is out of range

  • 10桁として突っ込む場合(OK)
%%time
unix_adjust = 1000 # ミリ秒まではいらないので
a = train.iloc[0, 2]
print(a)
print(datetime.datetime.fromtimestamp(a / unix_adjust, datetime.timezone.utc))

1659304800025 2022-07-31 22:00:00.025000+00:00 CPU times: user 7.86 ms, sys: 989 µs, total: 8.85 ms Wall time: 8.02 ms

せっかくなのでUNIX timestampをdatetimeに変換するところまでやってみます。データ数が22mio超えと大きいのでapplynp.vectorizeを使用したときの速度の違いもみてみみます。5秒くらいnp.vectorizeを使用することで短縮できました、データ数が増えればもっと短くなるんですかね?

  • applyを使用したとき
%%time
print(len(train))
unix_adjust = 1000 # ミリ秒まではいらないので
# apply
train["ts_datetime"] = train["ts"].apply(lambda x: datetime.datetime.fromtimestamp(x / unix_adjust, datetime.timezone.utc))

22547356 CPU times: user 30 s, sys: 1.73 s, total: 31.7 s Wall time: 31.6 s

  • np.vectorizeを使用したとき
%%time
print(len(train))
unix_adjust = 1000 # ミリ秒まではいらないので
# np.vectorize
def func_0(ts):
    return datetime.datetime.fromtimestamp(ts / unix_adjust, datetime.timezone.utc)
train["ts_datetime"] = np.vectorize(func_0)(train["ts"])

22547356 CPU times: user 23.4 s, sys: 3.38 s, total: 26.8 s Wall time: 26.8 s