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

如何按指定相对时间顺序对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 03:16:01