Python datetime データをスッキリさせて保存
タイムゾーン設定&現在時刻の取得
現在時刻を取得するには次のように書く。 タイムゾーンを指定しないと標準時になるため注意。
import datetime import pandas as pd import random import time import pytz dt_now = datetime.datetime.now(pytz.timezone('Asia/Tokyo')) print(dt_now)
2021-01-27 00:10:11.951768+09:00
ただこの形式のままだとタイムゾーン情報まで記録してしまう。また、精度もマイクロ秒となっている。正直ここまで詳しい情報は必要ないし、時間情報は常に記録するものなのでデータ量削減のためにもスッキリさせたい。 なのでタイムゾーンなし+秒単位までで記録を行う。
現状の確認
まずはそのままDataFrameとして保存するとどうなるか見てみる。1秒おきに時間と乱数を保存してみた。
d = {} d['time'] = [] d['val'] = [] for i in range(5): d['time'].append(datetime.datetime.now(pytz.timezone('Asia/Tokyo'))) d['val'].append(random.random()) time.sleep(1)
df = pd.DataFrame(d) df
time | val | |
---|---|---|
0 | 2021-01-27 00:10:12.954969+09:00 | 0.531003 |
1 | 2021-01-27 00:10:13.956126+09:00 | 0.020670 |
2 | 2021-01-27 00:10:14.957337+09:00 | 0.562972 |
3 | 2021-01-27 00:10:15.958551+09:00 | 0.749389 |
4 | 2021-01-27 00:10:16.959756+09:00 | 0.635614 |
df['time']
0 2021-01-27 00:10:12.954969+09:00 1 2021-01-27 00:10:13.956126+09:00 2 2021-01-27 00:10:14.957337+09:00 3 2021-01-27 00:10:15.958551+09:00 4 2021-01-27 00:10:16.959756+09:00 Name: time, dtype: datetime64[ns, Asia/Tokyo]
DataFrameの中でもマイクロ秒単位まで記録されており、ひじょうに長い。
文字列に変換して保存
そこで一旦文字列に変換して保存する。
d2 = {} d2['time'] = [] d2['val'] = [] for i in range(5): t = datetime.datetime.now(pytz.timezone('Asia/Tokyo')).strftime('%Y-%m-%d %H:%M:%S') d2['time'].append(t) d2['val'].append(random.random()) time.sleep(1)
df2 = pd.DataFrame(d2) df2
time | val | |
---|---|---|
0 | 2021-01-27 00:37:36 | 0.395559 |
1 | 2021-01-27 00:37:37 | 0.793888 |
2 | 2021-01-27 00:37:38 | 0.417575 |
3 | 2021-01-27 00:37:39 | 0.455042 |
4 | 2021-01-27 00:37:40 | 0.482387 |
df2["time"]
0 2021-01-27 00:37:36 1 2021-01-27 00:37:37 2 2021-01-27 00:37:38 3 2021-01-27 00:37:39 4 2021-01-27 00:37:40 Name: time, dtype: object
するとかなりスッキリし、想定していた形式にすることができた。
ただしData TypeがDatetimeでなくなっているのでグラフとして書くときに困ってしまう。 なのでその場合は読み込むときにDate timeに変換すればOK。
df2['time'] = pd.to_datetime(df2['time'], format="%Y-%m-%d %H:%M:%S") df2['time']
0 2021-01-27 00:37:36 1 2021-01-27 00:37:37 2 2021-01-27 00:37:38 3 2021-01-27 00:37:39 4 2021-01-27 00:37:40 Name: time, dtype: datetime64[ns]