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

问题描述

我有一些看起来像这样的代码

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 时向帧添加新列。 biobirdman on a previous post 建议使用此方法。然后您可以使用 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,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))

enter image description here