今回は、Pythonを用いて自動で時系列順に並ぶフォルダーを作成していきます。時系列フォルダーとは、イメージ的には、”2021年”などの年フォルダーの下に、”1月~12月”までの月フォルダーを作成し、さらにその下に日にちフォルダーを作成していきます。
これができると、時系列フォルダーを一括かつ一瞬で作成できるので、実務での業務効率がアップすると思います。それではやっていきましょう。
▼ Contents
1. 使用環境
- OS: Windows10 Pro
- Python: Version 3.8.8 (3.2以上であれば問題なしです)
- pandas: Version 1.2.4
2. 使用ライブラリ
本記事で使用するpythonライブラリは以下の2つです。
2-1. os.makedirs
簡単に言えば、os(windows)の機能を使用して、フォルダーを作成するライブラリです。
詳しい説明は公式サイトか、「Pythonでディレクトリ(フォルダ)を作成するmkdir, makedirs」をご確認ください。
2-2. pandas.date_range
もう一つが、pandas.date_rangeです。こちらは、作成したい時系列のリストを構築するために使用します。
pandas.date_range
pandas.date_range
(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None, **kwargs)
また、pandas.date_rangeのパラメータの一つに”freq”というものがあります。こちらの設定は後述の通り、非常に重要です。その設定値に関しては、以下のサイトに記載がありますので、ご確認ください。
A number of string aliases are given to useful common time series frequencies. We will refer to these aliases as offset aliases.
Offset aliases
3. 実務で使えるフォルダ作成コード
フォルダー作成コードの主な流れは以下です。
- 作成する時系列データの期間を設定する。
- ①期間の時系列リストを作成する。
- 年、月、日のデータに分ける
- ③のデータを利用して、フォルダーパスを決定する
- フォルダーを作成する

それでは、各プロセスを順に見ていきましょう。
3-1. 作成する時系列データの期間を設定する
これは簡単です。以下のようなコードで、フォルダー作成期間を決定してください。
今回はサンプルとして、2021年1月1日から2021年12月31日までの期間としました。
start = "2021-01-01"
end = "2021-12-31"
3-2. 期間の時系列リストを作成する
3-1で決定した期間の時系列リストを作成します。まず、以下のコードで日にちデータフレームを作成します。
start、endは先程決定した時系列期間です。”freq”の”D”は、1日ごとに日付データを作成するパラメータです。
dates = pd.date_range(start=start, end=end, freq="D")
上記コードにより、図1のような時系列データが作成されますが、”DatetimeIndex”型なので、データ型を変更していきます。

以下のコードを入力します。
dates = dates.to_series(name="Date)
pandas.Index.to_series()でIndexを図2のようにシリーズデータに変更します。to_series()が不明な方は公式サイトをご確認ください。

ただし、現状では年月日以外のデータもあるため、日付データを文字列型データに変換して扱いやすいようにします。以下のコードを記載ください。
dates = dates.dt.strftime("%Y-%m-%d")
このコードでDatetime型を文字列型に変換しました。図3はコード実行結果ですが、dtypesが”object”になっていることが確認できます。

以下のコードで文字列型に変換したデータを取得します。これで期間の時系列リストを作成は完了です。
dates = dates.vaules
3-3. 年、月、日のデータに分ける
こちらは”split”を使用していきます。たとえば、datesのひとつめのデータは”2021-01-01″ですが、年データ”2021″、月データ”01″、日データ”01″に分けていきます。以下のコードで実装できます。
date = dates[0]
year, month, day = date.split("-")[0], date.split("-")[1], date.split("-")[2]
3-4. 年月日データを利用して、フォルダーパスを決定する
3-3で指定した年月日データを使用して、作成するフォルダー階層やフォルダー名を決定します。今回は、以下のようなフォルダー階層とします。
- sample
- 年
- 月
- 日
上記のようなフォルダー階層とするには、以下のようなフォルダーパスを指定します。
new_dir_path = 'sample/{0}年/{1}月/{2}日'.format(year, month, day)
このフォルダパスにより、”2021年”=>”01月”=>”01日”のようなフォルダー構成を作成する準備ができました。
3-5. フォルダーを作成する
いよいよ最後です。3-4で決定したフォルダーパスにフォルダーを作成します。以下のコードで簡単に作成できます。
os.makedirs(new_dir_path, exist_ok=True)
なお、exist_okは必ず”True”にしておいてください。
Pythonのバージョン
3.2
でos.makedirs()
に引数exist_ok
が追加された。引数exist_ok(Python3.2以降)
exist_ok=True
とすると既に存在しているディレクトリを指定してもエラーにならない。デフォルトはexist_ok=False
なので注意。
最後に3-3 ~ 3.5をfor文で各日付データに対して実行すれば、時系列データが作成されます。
4. サンプルコード
以下は本記事をまとめたサンプルコードです。
import os
import pandas as pd
start, end = "2021-01-01", "2021-12-31"
dates = pd.date_range(start=start, end=end, freq="D").to_series().dt.strftime("%Y-%m-%d").values
for date in dates:
year, month, day = date.split("-")[0], date.split("-")[1], date.split("-")[2]
new_dir_path = 'sample/{0}年/{1}月/{2}日'.format(year, month, day)
os.makedirs(new_dir_path, exist_ok=True)
本コードを実行すると、図3のように一瞬で時系列フォルダーが作成されます。

あとはお好みですが、月と日の階層を分けたくない場合は、フォルダーパス名を以下のように変更すれば、図4のように同じ階層に月日フォルダーが実装可能です。
new_dir_path = 'sample/{0}年/{1}月-{2}日'.format(year, month, day)

5. 応用(時系列データを意図的に変更する)
本記事では、時系列データを1日毎にしましたが、pandas.date_rangeの”freq”パラメータを変更することで、日付をある程度柔軟に選択することが可能です。
土日のフォルダーを作成する必要がない場合、”freq”パラメータを”B”とすることで土日を除去した時系列データを作成することが可能です。
""" 'D' => 'B'に変更 """
dates = pd.date_range(start=start, end=end, freq="B")
これだけで、図5のように土日を除去したフォルダーを作成することができます。

“freq”の設定方法は、たくさんあるので以下を公式サイトを確認しいただき、ご自身の環境に合わせたパラメータを設定いただけると、より業務効率が上がると思います。
A number of string aliases are given to useful common time series frequencies. We will refer to these aliases as offset aliases.
Offset aliases
6. まとめ
フォルダー作成はすぐできますが、毎回同じことをしていると実は結構時間を取られたりしています。フォルダーパスの構成が決定しているのであれば、pythonにまかせて自動で作成したほうが効率的かなと思います。
ぜひ、本記事を活用していただき、業務効率を高めていただければ幸いです。

よいPythonライフを!

以下の記事も書いています。よかったらご覧ください。

Twitterもやってまーす。
Pythonバージョンが3.2以上あれば、本記事のコードは動くと思います。