DataFrame sort_values在混存datetime与date的列上排序失败的解决方法
解决方法
核心思路
借助pandas.DataFrame.sort_values的key参数(pandas 1.1.0及以上版本支持),在排序阶段动态统一日期类型——将datetime.date对象转换为指定时间点的datetime.datetime对象,无需修改原数据的底层结构,性能开销远小于全量转换整列数据。
代码实现
基础版:将date转为当天0点的datetime
from datetime import datetime, date def unify_date_type(dt, end_of_day=False): # 仅对纯date类型做转换,datetime类型直接返回 if isinstance(dt, date) and not isinstance(dt, datetime): if end_of_day: # 转换为当天23:59:59.999 return datetime.combine(dt, datetime.max.time()) else: # 转换为当天00:00:00 return datetime.combine(dt, datetime.min.time()) return dt # 执行排序 sorted_data = data.sort_values( by='date', ascending=False, na_position='last', key=lambda col: col.apply(unify_date_type) ) # 遍历输出open列 for d in sorted_data['open']: print(d)
配置版:转为当天结束时间
只需在调用转换函数时传入end_of_day=True:
sorted_data = data.sort_values( by='date', ascending=False, na_position='last', key=lambda col: col.apply(lambda x: unify_date_type(x, end_of_day=True)) )
优势说明
- 无需修改原DataFrame的列结构,仅在排序过程中临时生成转换后的序列,排序完成后自动回收,内存占用低。
- 针对混合类型的场景精准处理,只转换需要调整的
date对象,避免无意义的计算。
内容的提问来源于stack exchange,提问作者cmjordan
相关产品推荐
相关产品推荐

