如何按指定相对时间顺序对CSV设备同步记录排序?
解决CSV按自定义相对时间顺序排序的问题
问题核心是natsort库仅针对字符串自然排序,无法匹配你需要的自定义时间单位优先级(seconds → minutes → hours → days → weeks → months → years → Never)。要实现预期排序,需手动定义时间单位的权重映射,用内置sorted函数完成排序。
具体实现代码
import csv import os # 定义时间单位优先级映射,数值越小排序越靠前(代表时间越新) TIME_PRIORITY = { "seconds": 0, "minutes": 1, "hours": 2, "days": 3, "weeks": 4, "months": 5, "years": 6, "Never": 7 } def get_sort_key(item): last_sync = item["last_sync"].strip() # 处理两种格式:"X 单位 ago" 和 "Never" if last_sync == "Never": unit = "Never" else: # 拆分字符串提取时间单位,比如"5 minutes ago"取倒数第二个单词"minutes" parts = last_sync.split() unit = parts[-2] if len(parts) >= 2 else "Never" # 返回对应优先级,未知单位默认归到Never组 return TIME_PRIORITY.get(unit, 7) fieldnames = ["device", "last_sync"] with open("Devices_161846.csv", "rt") as csvfile: csvreader = csv.DictReader(f=csvfile, fieldnames=fieldnames) next(csvreader) # 跳过表头 identities = list(csvreader) # 按自定义优先级排序,reverse=False即为从最新到最旧的顺序 sorted_identities = sorted(identities, key=get_sort_key) new_file, ext = os.path.splitext(csvfile.name) with open(f"{new_file}_Sorted.{ext}", "wt") as f: csvwriter = csv.DictWriter(f=f, fieldnames=fieldnames) csvwriter.writeheader() csvwriter.writerows(sorted_identities)
关键说明
- 优先级映射:
TIME_PRIORITY字典明确了每个时间单位的排序权重,完全匹配你需要的时间新旧顺序。 - 单位提取逻辑:适配了"X 单位 ago"和"Never"两种常见格式,异常格式默认归为
Never组,避免排序出错。 - 替代natsort:本次排序依赖自定义权重而非字符串自然顺序,内置
sorted函数即可满足需求,无需使用natsort。
内容的提问来源于stack exchange,提问作者Tes3awy
相关产品推荐
相关产品推荐

