读取多个 csv 文件时将文件名附加到列 header

Append filename to column header when reading multiple csv files

我想读取多个 .csv 文件并将其文件名的日期时间部分附加到列 header。每个 csv 文件都包含在特定日期时间获取的数据。每个文件名都具有以下格式:

yyyy-mm-dd_hh-mm-ss_someothertext

每个文件只包含一列数据。

我成功导入多个文件作为数据框列表,如下所示:

import pandas as pd
import glob

path = r'C:\Users\...' #path
all_files = glob.glob(path + "/*.csv")

li = []

for filename in all_files:
    df = pd.read_csv(filename, index_col=None, header=0)
    li.append(df)

然后我将这些文件连接成一个数据框,这样每一列都包含来自其中一个文件的数据:

frame = pd.concat(li, axis=1, ignore_index=True)

但是,这是我丢失文件名信息的地方。 header 列现在只是一系列数字。我的问题是:如何将每个文件名的日期时间部分附加到 frame 中的相应列 header?

我得到的最接近的是能够通过转置frame以迂回的方式附加整个文件名,而不仅仅是日期时间部分,将整个文件名添加为新列,转回,然后将文件名行设置为 header 行...

import os
frame=pd.DataFrame.transpose(frame)
frame['filename'] = os.path.basename(filename)
frame=pd.DataFrame.transpose(frame)
frame.reset_index(drop=True)
frame.columns = frame.iloc[6628] #row 6628 is where the row with the filenames ends up after transposing

虽然这看起来非常低效,但最终以整个文件名作为 header 而不仅仅是日期时间部分。

这是我建议的方法,压缩 DataFrame 并使用正则表达式:

import re
import os
import glob
import pandas as pd

path = 'C:\Users\....'
files = glob.glob(f'{path}\*.csv')

li = []

for file in files:
     name = os.path.basename(file)  # get filename
     date = re.search(r'\d{4}-\d{2}-\d{2}', name).group(0)  # extract yyyy-mm-dd from filename
     # read file, squeeze to Series, rename to date
     li.append(pd.read_csv(file, index_col=None, header=0, squeeze=True).rename(date))  

frame = pd.concat(li, axis=1, ignore_index=False)