時間関係のオブジェクトを扱う
時間関係のモジュール
timeとdatetimeが存在する。また時間についてはエポックタイムという概念も存在する。
time
time.time()でエポックタイムを取得できる。
http://sweng.web.fc2.com/ja/program/python/time.html
datetime
今の時間をとる。それはdatetime.datetime.now()でできる。
datetime.datetime.now()をUNIX時間に変換するにはdatetimeオブジェクトのtimestampメソッドを使えば良い。
https://note.nkmk.me/python-unix-time-datetime/
import datetime now = datetime.datetime.now() now # datetime.datetime(2019, 8, 10, 12, 8, 12, 636212) now.timestamp() # 1565406492.636212
これで636212を削除するにはどうすればよいのか?そこが疑問。
今のUNIX時間をとるにはどうすればいいのか?それはまずdatetimeの今の時間を取得する。その時間をtimestamp()メソッドを使うとエポックタイム(UNIX時間)に変換することができる。
エポックタイム
まだ詳しくはわからないが、エポックタイムはエポックタイムオブジェクトってのはないのか?time.time()で返されるのはミリ秒を含むfloat型データだし、int(time.time())はミリ秒を除くint型データである。これらはエポックタイムを表すので、datetime.datetime.fromstamp(floatかint型のエポックタイム)で成立する。
次気になるのはdatetime型データからどうstrデータに変換するか。datetimeオブジェクト.strftime(フォーマット)を使えば良い。
軽くまとめるとエポックタイムからデイトタイム型に変換してそれを文字列化するには以下の手順を踏む。
import time , datetime now_u = time.time() #floatで取得 now_u = int(now_u) #ミリ秒を削除してint型にした now = datetime.datetime.fromtimestamp(now_u) # datetime型に変換した format = "%Y-%m-%d %H:%M:%S" t = datetime.datetime.strftime(now, format) #これで文字列に変換できた t1 = datetime.datetime.strptime(t, format) #datetimeオブジェクトに戻す t1.timestamp() #エポックに戻す
#再利用コード mytools/treat.py import datetime, time def change2datetime(timestamp): """ UTC時間からdatetimeオブジェクトに変換する関数 time(timestamp) → datetime """ d = datetime.datetime.fromtimestamp(timestamp) return d def change2d_str(d): """ datetimeオブジェクトから文字列"2019-8-11 17:15:13"のような形に変換する関数 datetime → str """ dstr_format = "%Y-%m-%d %H:%M:%S" d_str = datetime.datetime.strftime(d, dstr_format) return d_str def timestamp2dstr(timestamp): """ UTC時間から時間を表す文字列に変換する関数 timestamp → str """ d = change_datetime(timestamp) d_str = change_d_str(d) return d_str
def get_rowlst(): row_list = [] with open("demo.csv", "r", encoding="utf-8") as f: reader = csv.reader(f) for row in reader: row_list.append(row) return row_list def get_staytime(lst, index): if index == len(lst)-1: return print("finish") timestamp = get_timestamp(lst[index]) next_timestamp = get_timestamp(lst[index+1]) staytime = int(next_timestamp) - int(timestamp) return staytime def extract_data(stay_time=None,seconds=10): if stay_time != None and stay_time > seconds: return "EXTRACT" else: return "IGNORE" def output_pdata(seconds=10): row_list = get_rowlst() for index,row in enumerate(row_list): userid = get_userid(row) timestamp = get_timestamp(row) date = change_datetime(timestamp) stay_time = get_staytime(row_list, index) file_name = get_file_name(row) result = extract_data(stay_time=stay_time, seconds=950) if result == "EXTRACT": print(userid,timestamp,date,stay_time) t = (userid, date, stay_time, file_name,) cur.execute("""INSERT INTO registered (userid, date, stay_time, filename) VALUES (%s,%s,%s,%s)""", t) conn.commit() conn.close()