Python ファイルの名前が時間であるデータを取り出す

ファイルやディレクトリの名前が時間である場合に、ある期間内、そのファイルを読み込んで計算して出力する際、何度もプログラムの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つ紹介しました。

シェルでも同様な方法があるので是非