ファイルやディレクトリの名前が時間である場合に、ある期間内、そのファイルを読み込んで計算して出力する際、何度もプログラムのPATHを変えるのはとても面倒なことです。
本記事では、繰り返し処理で一度のプログラムだけで2000年1月1日00時から2021年12月31日23時までのファイルを一つずつ読み込んで実行する方法を紹介します。
仮定
以下のような例を想定します。
sampledataディレクトリに年のディレクトリがあり、その下に月のディレクトリ、その下に日のディレクトリがあるという想定です。
$ pwd
sampledata/2021/11/22/
$ ls
0000.bin 0600.bin 1200.bin 1800.bin
0100.bin 0700.bin 1300.bin 1900.bin
0200.bin 0800.bin 1400.bin 2000.bin
0300.bin 0900.bin 1500.bin 2100.bin
0400.bin 1000.bin 1600.bin 2200.bin
0500.bin 1100.bin 1700.bin 2300.bin
ここの例では、2021年11月22日の1時間ごとのデータが入っています。
同様に他のディレクトリでも1時間ごとのデータが入っていることを想定しています。
今回の記事では、Pythonを使います。
方法1:datetimeを使う
Pythonのモジュールdatetimeを使う方法があります。
上記のようなPATH(例:sampledata/2000/01/01)の場合、
import datetime
sdate = datetime.datetime(2000,1,1,0,0,0)
edate = datetime.datetime(2021,12,31,23,0,0)
cdate = sdate
while( cdate <= edate ):
file = cdate.strftime("sampledata/%Y/%m/%d/%H%M.bin")
with open(file) as f:
//処理
cdate = cdate + datetime.timedelta(hours=1)
3行目、変数sdateは、開始時刻、
4行目、変数edateは、終了時刻になります。
5行目の変数cdateは、現在の時刻で、初期値として、変数sdateを代入しています。
7行目で、繰り返し処理をしており、cdateがedate以下の時まで、処理をします。
8行目で、ファイルのPATHを指定しています。
9行目で、そのPATHを用いて、ファイルを開きます。
10行目で、一時間更新して、繰り返し処理に戻ります。
という流れです。
10行目のdatetime.timedelta(hours=1)のhours=1は、変更できます。
例:
2週間ごとに更新 | datetime.timedelta(weeks=2) |
20日ごとに更新 | datetime.timedelta(days=20) |
3時間ごとに更新 | datetime.timedelta(hours=3) |
15分ごとに更新 | datetime.timedelta(minutes=15) |
30秒ごとに更新 | datetime.timedelta(seconds=30) |
方法2:date_rangeを使う
PythonのモジュールPandasのdate_rangeを使う方法があります。
上記のようなPATHの場合、
import pandas as pd
stime="2000-01-01 00:00:00"
etime="2001-12-31 23:00:00"
rdate=pd.date_range(stime,etime,freq="1h")
for Date in rdate:
file = Date.strftime("sampledata/%Y/%m/%d/%H%M.bin")
with open(file) as f:
//処理
3行目、変数sdateは、開始時刻、
4行目、変数edateは、終了時刻になります。
6行目の変数rdateで、開始時刻から終了時刻までどのくらいの間隔かを指定しています。
pd.date_range(stime,etime,freq=”1h”)のfreqは変更できます。
2週間ごとに更新 | pd.date_range(stime,etime,freq=”2w”) |
20日ごとに更新 | pd.date_range(stime,etime,freq=”20d”) |
3時間ごとに更新 | pd.date_range(stime,etime,freq=”3h”) |
15分ごとに更新 | pd.date_range(stime,etime,freq=”15min”) |
30秒ごとに更新 | pd.date_range(stime,etime,freq=”30s”) |
8行目で、繰り返し処理をしており、6行目の情報を元に処理をします。
9行目で、ファイルのPATHを指定しています。
10行目で、そのPATHを用いて、ファイルを開きます。
という流れです。
まとめ
繰り返し処理で一度のプログラムだけである期間内を一定間隔でファイルを一つずつ読み込んで実行する方法を2つ紹介しました。
シェルでも同様な方法があるので是非