Pythonを時間についてループさせる
スクリプトとして使うためには、UNIXTIMEに変換して行うことがある。
UNIXTIMEから文字列、文字列からUNIXTIMEの変換をメモした。
ファイル名から時刻を読み取る場合
infileというファイルから、PATHを削り、ファイル名だけにして、
正規表現を使って、8個の数字を抜き取り、パターンマッチ。
パターンマッチすれば、文字列の抜き取り(巣ライジング)で時刻を取り出す。
import re import os tmp = os.path.basename(infile) if re.compile("\d\d\d\d\d\d\d\d").search(tmp): yy = str(int(tmp[0:2]) + 2000) mm = tmp[2:4] dd = tmp[4:6] hh = tmp[6:8]
UNIXTIMEは既に取得しており、文字列や年、月、日に焼き直したい
とりあえず、表示して確認してみたい
import pytz from datetime import datetime STIME = UNIXTIME[0] ETIME = UNIXTIME[NT-1] print (datetime.fromtimestamp(STIME,tz=pytz.utc)) print (datetime.fromtimestamp(ETIME,tz=pytz.utc))
とすると、UTCの時刻で時間が表示される。
まとまった文字列ではなく、各情報(年、月、日、時、分、秒)を取り出したい
yy = datetime.fromtimestamp(STIME,tz=pytz.utc).strftime("%Y") mm = datetime.fromtimestamp(STIME,tz=pytz.utc).strftime("%m") dd = datetime.fromtimestamp(STIME,tz=pytz.utc).strftime("%d") hh = datetime.fromtimestamp(STIME,tz=pytz.utc).strftime("%H") mn = datetime.fromtimestamp(STIME,tz=pytz.utc).strftime("%M") sc = datetime.fromtimestamp(STIME,tz=pytz.utc).strftime("%S")
ただし、これらのyy,mmは文字列ですので、整数として計算する場合、intを使ってcastする必要があります。
各情報(年、月、日、時、分)は分かっているので、これをUNIXTIMEにしたい
str_date = yy + "-" + mm + "-" + dd + "_" str_date += hh + ":" + mn + ":" + sc + "+0900" ddd = datetime.strptime(str_date,'%Y-%m-%d_%H:%M:%S%z') UNIXTIME = ddd.timestamp()
各要素を"年-月-日_時:分:秒+0900" というフォーマットの文字列にしなければならない。
ここで、0900の部分が時差です。JSTの場合、0900となり、UTCの場合、0000とします。
時間でループしたい1(サンプル カレンダー日時でループ)
例えば、2020年9月4日9時台(9:00から09:59までの1分毎のループ)
import subprocess year = [2020] mon = [9] day = [4] hour = list(range(9,10)) minute = list(range(0,60,1)) for yy in year: for mm in mon: for dd in day: for hh in hour: for mn in minute: ddd1 = '%04d/%02d/%02d/%02d/%02d/' % (yy,mm,dd,hh,mn) ddd2 = '%04d%02d%02d%02d%02dZ.nc' % (yy,mm,dd,hh,mn) DIR = rootdir + ddd1 infile = DIR + head + ddd2 command = "python3 main.py " + infile subprocess.run(command,shell=True)
などのように記載して、ディレクトリ(DIR)やファイル(infile)を特定して、
subprocessを使って、コマンドラインとして、commandで定義した実行をループして実行することができます。
時間でループしたい2(サンプル UNIXTIMEを経由してdt秒毎にループしたい)
入力としては、
python main.py 2020-10-01_00:00:00+0900 2020-11-01_00:00:00+0900
のように、開始時刻と修了時刻を上の表記で、外部から与えて、5分毎に何か処理をしたい。
import sys from datetime import datetime import pytz def main(): if len(sys.argv) < 2: print ("ARGV ERROR: stime etime") exit(1) stime = sys.argv[1] etime = sys.argv[2] UNIXTIME0 = datetime.strptime(stime,'%Y-%m-%d_%H:%M:%S%z').timestamp() UNIXTIME1 = datetime.strptime(etime,'%Y-%m-%d_%H:%M:%S%z').timestamp() dt = 300 for t in range(int(UNIXTIME0),int(UNIXTIME1),dt): print (t) yy = datetime.fromtimestamp(t,tz=pytz.utc).strftime("%Y") mm = datetime.fromtimestamp(t,tz=pytz.utc).strftime("%m") dd = datetime.fromtimestamp(t,tz=pytz.utc).strftime("%d") hh = datetime.fromtimestamp(t,tz=pytz.utc).strftime("%H") mn = datetime.fromtimestamp(t,tz=pytz.utc).strftime("%M") sc = datetime.fromtimestamp(t,tz=pytz.utc).strftime("%S") print (t,yy,mm,dd,hh,mn,sc)
datetime.strptime.timestamp とすると、最終的にはfloat型のオブジェクトとなったUNIXTIMEが
帰って来る。rangeは整数のイタレーターなので、intでキャストしてループさせる。ループの中は、
tで回るが、これを元のカレンダーに変換したいことが多いので、fromttimestampで元に戻す。
例では、UTCを使っているが、tzオプションを省略するとJSTになる