【Python入門】~初心者向け、業務効率UP~時系列フォルダー自動生成

今回は、Pythonを用いて自動で時系列順に並ぶフォルダーを作成していきます。時系列フォルダーとは、イメージ的には、”2021年”などの年フォルダーの下に、”1月~12月”までの月フォルダーを作成し、さらにその下に日にちフォルダーを作成していきます。

これができると、時系列フォルダーを一括かつ一瞬で作成できるので、実務での業務効率がアップすると思います。それではやっていきましょう。

1. 使用環境

  • OS: Windows10 Pro
  • Python: Version 3.8.8 (3.2以上であれば問題なしです)
  • pandas: Version 1.2.4
Baran

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

2. 使用ライブラリ

本記事で使用するpythonライブラリは以下の2つです。

2-1. os.makedirs

簡単に言えば、os(windows)の機能を使用して、フォルダーを作成するライブラリです。

詳しい説明は公式サイトか、「Pythonでディレクトリ(フォルダ)を作成するmkdir, makedirs」をご確認ください。

2-2. pandas.date_range

もう一つが、pandas.date_rangeです。こちらは、作成したい時系列のリストを構築するために使用します。

pandas.date_range(start=Noneend=Noneperiods=Nonefreq=Nonetz=Nonenormalize=Falsename=Noneclosed=None**kwargs)

pandas.date_range

また、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. 実務で使えるフォルダ作成コード

フォルダー作成コードの主な流れは以下です。

  1. 作成する時系列データの期間を設定する。
  2. ①期間の時系列リストを作成する。
  3. 年、月、日のデータに分ける
  4. ③のデータを利用して、フォルダーパスを決定する
  5. フォルダーを作成する
Baran

それでは、各プロセスを順に見ていきましょう。

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”型なので、データ型を変更していきます。

図1 “DatetimeIndex”型

以下のコードを入力します。

dates = dates.to_series(name="Date)

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

図2 シリーズデータに変換

ただし、現状では年月日以外のデータもあるため、日付データを文字列型データに変換して扱いやすいようにします。以下のコードを記載ください。

dates = dates.dt.strftime("%Y-%m-%d")

このコードでDatetime型を文字列型に変換しました。図3はコード実行結果ですが、dtypesが”object”になっていることが確認できます。

図2 文字列型データに変換

以下のコードで文字列型に変換したデータを取得します。これで期間の時系列リストを作成は完了です。

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で指定した年月日データを使用して、作成するフォルダー階層やフォルダー名を決定します。今回は、以下のようなフォルダー階層とします。

  1. 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.2os.makedirs()に引数exist_okが追加された。

exist_ok=Trueとすると既に存在しているディレクトリを指定してもエラーにならない。デフォルトはexist_ok=Falseなので注意。

引数exist_ok(Python3.2以降)

最後に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のように一瞬で時系列フォルダーが作成されます。

図3 実行結果

あとはお好みですが、月と日の階層を分けたくない場合は、フォルダーパス名を以下のように変更すれば、図4のように同じ階層に月日フォルダーが実装可能です。

new_dir_path = 'sample/{0}年/{1}月-{2}日'.format(year, month, day)
図4 実行結果2

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にまかせて自動で作成したほうが効率的かなと思います。

ぜひ、本記事を活用していただき、業務効率を高めていただければ幸いです。

Baran

よいPythonライフを!

Baran

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

Twitterもやってまーす。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ABOUT US

Baran-gizagiza
経歴:浪人→理系大学院卒業→大手製造業に就職(技術職)→アメリカ赴任中 仕事は、研究・設計など上流工程の仕事に携わっています。企業勤務を継続しながら、新しいことにチャレンジしたいと思い、ブログを下記はじめました。 このブログでは、趣味である 筋トレ(健康、ダイエット) AIとデータ(高校数学、プログラミング) 読書(主に自己啓発系) を中心に、人生経験やおすすめ情報の発信しています。