UNIX timestamp
まとめ
本文
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)
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超えと大きいのでapply
のnp.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