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になる