循环遍历 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 文件以创建连接的数据帧。需要在文件名中使用日期为每个文件创建新列的主要内容,如果未能解决你的问题,请参考以下文章