如何使用Pandas批量读取CSV并提取文件名中的站点名作为数据行对应列
解决方法
核心逻辑说明
- 先对
glob返回的文件路径列表做显式排序,固定文件处理顺序,解决拼接顺序混乱的问题 - 遍历每个文件时,从文件名中拆分提取站点名作为新列,同步调整列结构符合要求
- 所有单文件处理完成后统一拼接,拼接顺序和文件排序后的顺序完全一致
完整实现代码
import pandas as pd import glob import os pathd = r'C:\\Users\\U321103\\' all_files = glob.glob(pathd + "/*UNITED STATES.*RADIATION.csv") # 显式对文件列表排序,默认按文件名升序,有自定义排序需求可修改此处逻辑 all_files.sort() df_container = [] for fp in all_files: # 提取无路径的纯文件名 filename = os.path.basename(fp) # 按.分割文件名,取第三段作为站点名,对应示例的COPPER CROSSING plant_name = filename.split('.')[2] # 读取csv,usecols指定只读取需要的列,减少内存占用 # 请将下方<辐射数据实际列名>替换为你文件中辐射列的真实名称 temp_df = pd.read_csv(fp, usecols=['YYMMDD', 'HHMM', '<辐射数据实际列名>']) # 新增站点名列 temp_df['plant_name'] = plant_name # 重命名辐射列为要求的data temp_df.rename(columns={'<辐射数据实际列名>': 'data'}, inplace=True) # 调整列顺序为要求的结构 temp_df = temp_df[['plant_name', 'data', 'YYMMDD', 'HHMM']] df_container.append(temp_df) # 按顺序拼接所有数据,重置全局行索引 final_df = pd.concat(df_container, ignore_index=True)
特殊场景补充
如果每个文件的辐射列列名不固定,可取消
usecols参数,通过列位置读取辐射数据:
假设文件前两列固定为YYMMDD、HHMM,第三列为辐射数据,可将读取csv的代码替换为:temp_df = pd.read_csv(fp) temp_df.columns = ['YYMMDD', 'HHMM', 'data']
内容的提问来源于stack exchange,提问作者user2100039
相关产品推荐
相关产品推荐

