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

如何在PrettyTable中存储datetime对象实现按日期而非字符串排序

解决方案

你遇到的排序异常是因为Month列存储的是字符串类型,PrettyTable默认按字符串字典序排序,想要按自然月份逻辑排序,存储datetime对象即可实现,另外也可以通过自定义排序键快速实现需求,两种方案如下:


方案1:存储datetime对象实现排序(推荐)

该方案底层存储标准日期对象,排序逻辑天然正确,后续扩展日期相关处理也更灵活,完整代码示例:

from prettytable import PrettyTable
import datetime

# 初始化表格
table = PrettyTable(["Name","Month", "Grade"])
table.title = "title test" 

# 添加行时,Month列存储对应月份的date对象(年份任选,不影响月份排序逻辑)
table.add_row(["Joe", datetime.date(2024, 1, 1), 90])
table.add_row(["Sally", datetime.date(2024, 2, 1), 100])
table.add_row(["Bill", datetime.date(2024, 3, 1), 90])
table.add_row(["Alice", datetime.date(2024, 4, 1), 90])

# 自定义Month列的显示格式,将date对象转换为需要的月份名称展示
# %B表示输出完整月份名(如April),%b表示输出缩写(如Apr),可按需调整
table.custom_format["Month"] = lambda field, value: value.strftime("%B")

# 直接按Month列排序即可,自动按日期逻辑排序
print(table.get_string(sortby="Month"))

运行后输出的Month列会按Jan→Feb→Mar→April的自然顺序排列。


方案2:自定义排序键(无需修改原有数据)

如果不想改动原有存储的月份字符串,可以通过sort_key参数自定义排序规则,改动量极小:

from prettytable import PrettyTable

# 原有代码完全不变,还是存储月份字符串
table = PrettyTable(["Name","Month", "Grade"])
table.title="title test" 
table.add_row(["Joe","Jan", 90])
table.add_row(["Sally", "Feb", 100])
table.add_row(["Bill", "Mar", 90])
table.add_row(["Alice", "April", 90])

# 定义月份名称到数字的映射,用于排序
month_order_map = {
    "Jan": 1, "Feb": 2, "Mar": 3, "April": 4,
    "May": 5, "Jun": 6, "Jul": 7, "Aug": 8,
    "Sep": 9, "Oct": 10, "Nov": 11, "Dec": 12
}

# 排序时指定sort_key,按映射的月份数字排序
print(table.get_string(
    sortby="Month",
    sort_key=lambda row: month_order_map[row[1]]
))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:48:00