循环遍历 csv 文件以创建连接的数据帧。需要在文件名中使用日期为每个文件创建新列

Looping through csv files to create concatenated dataframe. Need to use date in file name to create new column for each file

我有一些代码如下所示:

import pandas as pd
import glob

root_directory = r"\some\shared\directory"

all_files = glob.glob(f'{root_directory}\CPE_*.csv')

li = []

for filename in all_files:
    frame = pd.read_csv(filename, index_col=None, header=0, encoding='latin1')
    li.append(frame)

df = pd.concat(li, axis=0, ignore_index=True)

此代码允许我连接数据并创建一个主 csv 文件,但我想在循环遍历每个数据帧时向它们添加一个新列。文件名类似于: CPE_02082020.csv 、 CPE_02092020 等。所以日期在文件名本身中,格式为 mmddyyyy。如何在遍历并连接每个文件时向每个文件添加日期列?

要向每个数据框添加一个日期列,您只需在循环 all_files 时向框架添加一个新列即可。此方法由 建议。然后您可以使用 split() 从文件名中获取日期。

尝试:

for filename in all_files:
    frame = pd.read_csv(filename, index_col=None, header=0, encoding='latin1')
    frame['date'] = filename.split('_')[1]
    li.append(frame)

df = pd.concat(li, axis=0, ignore_index=True)

然后将 df['date'] 转换为 datetime 添加:

df['date'] = pd.to_datetime(df['date'])

您可以在 for 循环期间分配列,让我们使用列表理解和 Pathlib:

稍微简化一下
import pandas as pd 
from pathlib import Path 

root_dir = Path('\some\shared\directory')

all_files = root_dir.glob('*CPE_*.csv')

dfs = [
    pd.read_csv(f, index_col=None, header=0, encoding='latin1')\
            .assign(date_col=
                pd.to_datetime(f.stem.split('_')[1],format='%m%d%Y',errors='coerce'))
    for f in all_files
]


print(pd.concat(dfs))