You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python合并多CSV文件排序失效致日期列无序问题求助

解决CSV文件合并时的排序失效问题

你遇到的核心问题是字符串字典序排序与数字自然排序的差异:sorted()默认按字符串逐个字符比较,文件名中的数字会被当作字符串处理,导致"10"排在"2"前面,最终合并后的日期列数据无序。

修改后的代码

import os
import pandas as pd

# 使用原始字符串避免Windows路径的转义问题
file_path = r"C:\Users\PROJECT\Data Set\SMS Data\"
# 获取目标文件列表,用os.path.join拼接路径更安全
file_list = [os.path.join(file_path, f) for f in os.listdir(file_path) if f.startswith('call. sms ')]

# 自定义排序键:提取文件名中的数字转为整数
def get_file_number(file_path):
    file_name = os.path.basename(file_path)
    # 移除文件名中的固定前缀和后缀,提取数字部分
    num_str = file_name.replace('call. sms ', '').rstrip('.csv')
    return int(num_str)

# 按数字大小对文件列表排序
sorted_files = sorted(file_list, key=get_file_number)

csv_list = []
for file in sorted_files:
    csv_list.append(pd.read_csv(file).assign(File_Name=os.path.basename(file)))

csv_merged = pd.concat(csv_list, ignore_index=True)
csv_merged.to_csv(os.path.join(file_path, 'calls.sms.merged.csv'), index=False)

关键改进点

  • 路径处理:用os.path.join()替代字符串拼接路径,避免不同系统路径分隔符的兼容问题;用原始字符串r"..."解决Windows路径反斜杠的转义错误。
  • 自然排序:通过自定义get_file_number函数提取文件名中的数字并转为整数,让sorted()按数字大小而非字符串字典序排序,确保文件按1→2→…→9→10→11…的顺序合并。

通用适配方案(文件名格式多变时)

如果文件名中的数字位置不固定,可改用正则表达式提取数字:

import re

def get_file_number(file_path):
    file_name = os.path.basename(file_path)
    # 匹配文件名中的所有连续数字,取第一个匹配结果
    match = re.search(r'\d+', file_name)
    return int(match.group()) if match else 0

内容的提问来源于stack exchange,提问作者Maryam Faheem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:15:33