国立研究開発法人防災科学技術研究所 水・土砂防災研究部門
国立研究開発法人防災科学技術研究所 水・土砂防災研究部門
トップ 一覧 検索 ヘルプ RSS ログイン

PythonのUNIXTIME関連のプログラムメモ

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