如何对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"])
初始数据预览:
| id | dates |
|---|---|
| 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'] |
期望输出(升序排列+重复日期去重):
| id | dates |
|---|---|
| 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
相关产品推荐
相关产品推荐

