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

如何对含主键与双日期列的Pandas DataFrame按日期顺序正确排序

如何实现Pandas DataFrame的自定义日期排序?

你遇到的问题很典型——默认的sort_values是按列优先级依次排序,先排date_1非空的行,再处理date_1为空的行并按date_2排序,这就导致两类日期没法混合按时间顺序排列。要实现你想要的效果,核心是先生成一个统一的日期排序依据列,把每行的有效日期(不管是date_1还是date_2)提取出来,再基于这个列排序。

具体实现步骤

  • 确保日期列是datetime类型:如果你的date_1和date_2是字符串格式,先转成datetime,避免字符串排序的错误(比如"2021-11-9"会排在"2021-11-20"前面)。
  • 生成临时排序列:用combine_first方法,优先取date_1的值,date_1为空时取date_2的值,这样每行都有一个唯一的有效日期作为排序键。
  • 按主键和临时列排序:完成排序后可以删掉临时列,保持数据整洁。

完整代码示例

import pandas as pd
import numpy as np

# 构造你的示例DataFrame
data = {
    'Primary Key': [22, 22, 22, 22],
    'date_1': ['2021-11-20', '2021-11-24', np.nan, np.nan],
    'date_2': [np.nan, np.nan, '2021-11-23', '2021-11-22']
}
df = pd.DataFrame(data)

# 转换日期列为datetime类型
df['date_1'] = pd.to_datetime(df['date_1'])
df['date_2'] = pd.to_datetime(df['date_2'])

# 创建临时排序列:提取每行的有效日期
df['sort_date'] = df['date_1'].combine_first(df['date_2'])

# 按主键和临时日期列排序
df.sort_values(['Primary Key', 'sort_date'], inplace=True)

# 移除临时列并重置索引(可选)
df.drop('sort_date', axis=1, inplace=True)
df.reset_index(drop=True, inplace=True)

print(df)

运行后就能得到你期望的结果:

Primary Key      date_1      date_2
0           22 2021-11-20        NaT
1           22        NaT 2021-11-22
2           22        NaT 2021-11-23
3           22 2021-11-24        NaT

补充说明

如果你的数据中存在某行date_1和date_2都有值的情况,可以根据需求调整临时列的生成逻辑:

  • 取较早的日期:df['sort_date'] = df[['date_1', 'date_2']].min(axis=1)
  • 取较晚的日期:df['sort_date'] = df[['date_1', 'date_2']].max(axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:13:12