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

Posted

技术标签:

【中文标题】循环遍历 csv 文件以创建连接的数据帧。需要在文件名中使用日期为每个文件创建新列【英文标题】:Looping through csv files to create concatenated dataframe. Need to use date in file name to create new column for each file 【发布时间】:2021-06-28 13:16:11 【问题描述】:

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

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。如何在循环和连接每个文件时为每个文件添加日期列?

【问题讨论】:

每个新文件只会添加一列?文件的行数是否相等? 不是所有文件的行数都不相同。只是想在这个主数据框中添加 1 个“日期”列。 【参考方案1】:

您可以在 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))

【讨论】:

【参考方案2】:

要为每个数据框添加一个日期列,您只需在遍历 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'] 转换为日期时间添加:

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

【讨论】:

以上是关于循环遍历 csv 文件以创建连接的数据帧。需要在文件名中使用日期为每个文件创建新列的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历列表以从 SQL 查询创建多个数据帧

使用循环创建多个数据框

使用熊猫循环合并大量csv文件[重复]

Pandas:使用循环和分层索引将多个 csv 文件导入数据帧

循环遍历数据框列表以动态创建新列

如何避免循环遍历 pandas 中的分类变量以查看/操作数据帧切片/子集