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]