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

如何对Pandas DataFrame中存储日期列表的列按时间排序?

Pandas对列内存储的日期字符串列表排序实现

问题说明

数据集包含id、dates两列,其中dates列每行存储一个或多个未排序的%Y-%m-%d格式日期字符串列表,需要将每行日期按时间升序排列,示例构造数据代码如下:

import pandas as pd
from datetime import datetime

data = [
    [1, ["2017-12-06", "2017-12-05", "2017-12-06", "2018-01-03", "2018-01-04", "2017-11-24"]],
    [2, ["2017-12-06", "2017-12-05", "2017-12-06", "2019-01-03"]]
]
df = pd.DataFrame(data, columns=["id", "dates"])

初始数据预览:

iddates
1['2017-12-06', '2017-12-05', '2017-12-06', '2018-01-03', '2018-01-04', '2017-11-24']
2['2017-12-06', '2017-12-05', '2017-12-06', '2019-01-03']

期望输出(升序排列+重复日期去重):

iddates
1['2017-11-24', '2017-12-05', '2017-12-06', '2018-01-03', '2018-01-04']
2['2017-12-05', '2017-12-06', '2019-01-03']

原有代码失效原因

之前的实现返回全None,核心原因是Python列表的list.sort()方法是原地修改操作,不会返回排序后的新列表,默认返回值为None,因此apply执行后拿到的结果全为空值。

# 错误写法示例
f = lambda x: x.sort(key=lambda date: datetime.strptime(date, "%Y-%m-%d"))
df["dates"].apply(f)

正确实现方案

  • 仅排序保留重复值:因为YYYY-MM-DD格式的日期字符串字典序和时间先后顺序完全一致,直接用内置sorted()函数即可,该函数会返回排序后的新列表,不会原地修改原数据:
    # 最简写法,无需转datetime类型
    df["dates"] = df["dates"].apply(sorted)
    
    # 若需要严格按时间类型排序(兼容后续可能的格式变动)
    df["dates"] = df["dates"].apply(
        lambda x: sorted(x, key=lambda d: datetime.strptime(d, "%Y-%m-%d"))
    )
    
  • 排序+去重(匹配示例期望输出):排序后利用Python 3.7+字典键有序且不重复的特性去重,再转回列表即可:
    df["dates"] = df["dates"].apply(
        lambda x: list(dict.fromkeys(sorted(x)))
    )
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:36:17