前提
- 環境:Python 3.11.4
- 細かいパスの指定は省略
今回のゴール
'sample_data_2023-07-23.csv'や'2023-07-23_sample_data.csv'といった、任意の場所にある'yyyy-mm-dd'を抽出し、2列目にdateという列として、追加する処理を複数ファイルまとめて実行したい。 前回の記事ではfilepath1やfilepath2といった風にファイル名を手動で指定しましたが、10個のファイルをまとめて処理を行いたいという場合もあると思うので、複数ファイルに対して、まとめて処理を行いたい。sample.py
>>> import pandas as pd
>>> filename1 = 'sample_data_2023-07-23.csv'
>>> filename2 = '2023-07-24_sample_data.csv'
>>> filename3 = '2023-07-25_data.csv'
>>> df1 = pd.read_csv(filename1)
>>> df2 = pd.read_csv(filename2)
>>> df3 = pd.read_csv(filename3)
>>> df1.head()
id
0 1
1 2
2 3
3 4
4 5
>>> df2.head()
id
0 1
1 2
2 3
3 4
4 5
>>> df3.head()
id
0 1
1 2
2 3
3 4
4 5
sample.py
#完成系
#'sample_data_2023-07-23.csv'の「2023-07-23」を抽出して、追加したい
>>> df1.head()
id date
0 1 2023-07-23
1 2 2023-07-23
2 3 2023-07-23
3 4 2023-07-23
4 5 2023-07-23
#'2023-07-24_sample_data.csv'の「2023-07-24」を抽出して、追加したい
>>> df2.head()
id date
0 1 2023-07-24
1 2 2023-07-24
2 3 2023-07-24
3 4 2023-07-24
4 5 2023-07-24
#'2023-07-25_data.csv'の「2023-07-25」を抽出して、追加したい
>>> df3.head()
id date
0 1 2023-07-25
1 2 2023-07-25
2 3 2023-07-25
3 4 2023-07-25
4 5 2023-07-25
流れ
- 任意のフォルダを指定し、そこからワイルドカードを使い、対象のファイルをリストで抽出
- 取得したリストに対して、for文を使い、ファイルの数だけ以下の3~5の処理を繰り返す
- 正規表現を使い、yyyy-mm-dd形式のデータを抽出
- 抽出したデータを変数に格納
- 新たな列に追加
1.任意のフォルダを指定し、そこからワイルドカードを使い、対象のファイルをリストで抽出
sample.py
>>> import re
>>> import grob
>>> filename1 = 'sample_data_2023-07-23.csv'
>>> filename2 = '2023-07-24_sample_data.csv'
>>> filename3 = '2023-07-25_data.csv'
#上記3つのファイルをC:\Users下に格納する
>>> filename1_path = r'C:\Users\sample_data_2023-07-23.csv'
>>> filename2_path = r'C:\Users\2023-07-24_sample_data.csv'
>>> filename3_path = r'C:\Users\2023-07-25_data.csv'
#ワイルドカードを使用して、C:\Users下のCSVファイルをリストで取得する
>>> source_path = r'C:\Users\*.csv'
>>> get_list_path = glob.glob(source_path)
>>> get_list_path
['C:\Users\sample_data_2023-07-23.csv',
'C:\Users\2023-07-24_sample_data.csv',
'C:\Users\2023-07-25_data.csv']
2.取得したリストに対して、for文を使い、ファイルの数だけ以下の3~5の処理を繰り返す
sample.py
#for文を使うとリストに格納された値1つ1つに対して、処理ができる
>>> for path in get_list_path:
... print(f'{path}に対して3~5の処理を実行')
...
C:\Users\sample_data_2023-07-23.csvに対して3~5の処理を実行
C:\Users\2023-07-24_sample_data.csvに対して3~5の処理を実行
C:\Users\2023-07-25_data.csvに対して3~5の処理を実行
3~5の処理まとめ
3~5の処理は前回の記事で詳しく説明していますので、詳しくはそちらをご覧ください。sample.py
#sample_data_2023-07-23.csvを例に説明
>>> import re
>>> filename1 = 'sample_data_2023-07-23.csv'
>>> date1 = re.search(r'\d{4}-\d{2}-\d{2}',filename1).group()
>>> df1['date'] = date1
#関数で表すと
>>> import os
>>> def add_date(path):
... df = pd.read_csv(path)
#os.path.basename()を使うとファイル名だけを取得できる
... file_name = os.path.basename(path)
... get_date = re.search(r'\d{4}-\d{2}-\d{2}',file_name).group()
... df['date'] = get_date
... return df.head()
まとめ
今までの内容を組み合わせ、最終的なコードは以下になります。 今回は組み込んでいませんが、for文の中にエクセルファイルのエクスポートの処理など組み込めば、任意の場所に日付を追加したファイルを一度に生成できるので、便利です。sample.py
>>> import re
>>> import os
>>> import pandas as pd
>>> def add_date(path):
... df = pd.read_csv(path)
... file_name = os.path.basename(path)
... get_date = re.search(r'\d{4}-\d{2}-\d{2}',file_name).group()
... df['date'] = get_date
... return df.head()
>>> source_path = r'C:\Users\*.csv'
>>> get_list_path = glob.glob(source_path)
>>> for path in get_list_path:
... print(path)
... add_date(path)
C:\Users\sample_data_2023-07-23.csv
id date
0 1 2023-07-23
1 2 2023-07-23
2 3 2023-07-23
3 4 2023-07-23
4 5 2023-07-23
C:\Users\2023-07-24_sample_data.csv
id date
0 1 2023-07-24
1 2 2023-07-24
2 3 2023-07-24
3 4 2023-07-24
4 5 2023-07-24
C:\Users\2023-07-25_data.csv
id date
0 1 2023-07-25
1 2 2023-07-25
2 3 2023-07-25
3 4 2023-07-25
4 5 2023-07-25