Pandas合并CSV文件时按文件名添加条件日期列未生效如何解决
问题原因
- 条件判断不成立:代码中
[f] == '1 Sept 21.csv'的写法是将列表类型的[f]和字符串类型的文件名比较,类型不一致永远返回False,所有条件分支都不会触发。 - 赋值符号使用错误:所有给
Date_of_file列赋值的位置都用了相等判断符==,而非赋值符=,即使进入分支也不会真的修改DataFrame的内容。 - 列赋值逻辑错误:Pandas支持直接给整列赋值同一个固定值,不需要乘以DataFrame的长度,该写法反而会导致赋值逻辑报错。
修正方案
方案1:修改原有匹配逻辑
如果你需要保留手动匹配文件名的规则,修正后的代码如下:
import os import glob import pandas as pd from datetime import datetime os.chdir("../Stok list") extension = 'csv' all_filenames = [i for i in glob.glob(f'*.{extension}')] combined_csv = [] for f in all_filenames: df = pd.read_csv(f) df['filename'] = f if f == '1 Sept 21.csv': df['Date_of_file'] = datetime.strptime('01/09/2021', '%d/%m/%Y') elif f == '2 Sept 21.csv': df['Date_of_file'] = datetime.strptime('02/09/2021', '%d/%m/%Y') elif f == '3 Sept 21.csv': df['Date_of_file'] = datetime.strptime('03/09/2021', '%d/%m/%Y') elif f == '6 Sept 21.csv': df['Date_of_file'] = datetime.strptime('06/09/2021', '%d/%m/%Y') elif f == '7 Sept 21.csv': df['Date_of_file'] = datetime.strptime('07/09/2021', '%d/%m/%Y') elif f == '8 Sept 21.csv': df['Date_of_file'] = datetime.strptime('08/09/2021', '%d/%m/%Y') elif f == '9 Sept 21.csv': df['Date_of_file'] = datetime.strptime('09/09/2021', '%d/%m/%Y') elif f == '10 Sept 21.csv': df['Date_of_file'] = datetime.strptime('10/09/2021', '%d/%m/%Y') elif f == '13 Sept 21.csv': df['Date_of_file'] = datetime.strptime('13/09/2021', '%d/%m/%Y') else: df['Date_of_file'] = 'No date' combined_csv.append(df) combined_csv = pd.concat(combined_csv) combined_csv.to_csv("../combined_csv.csv", index=False, encoding='utf-8-sig')
方案2:自动解析文件名生成日期(更推荐)
你的文件名本身就是标准的日期格式,可以直接从文件名解析日期,不需要写大量重复的条件分支,后续新增同格式的日期文件也不需要修改代码:
import os import glob import pandas as pd from datetime import datetime os.chdir("../Stok list") extension = 'csv' all_filenames = [i for i in glob.glob(f'*.{extension}')] combined_csv = [] for f in all_filenames: df = pd.read_csv(f) df['filename'] = f try: # 直接从文件名去掉后缀后解析日期 date_part = f.rsplit('.', 1)[0] df['Date_of_file'] = datetime.strptime(date_part, '%d %b %y') except ValueError: # 日期解析失败时赋值默认值 df['Date_of_file'] = 'No date' combined_csv.append(df) combined_csv = pd.concat(combined_csv) combined_csv.to_csv("../combined_csv.csv", index=False, encoding='utf-8-sig')
内容的提问来源于stack exchange,提问作者Tman
相关产品推荐
相关产品推荐

