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

已知日期属同一月份,如何用Pandas对混合格式日期列升序排序?

混合格式日期列升序排序方案

已知某列日期字符串均属于单个月份,其中部分格式为mm/dd/yy(月/日/年),部分为dd/mm/yy(日/月/年),需将该列按日期升序排序。

示例1

data = {
    'date': ['1/1/2020','20/1/2020', '1/1/2020', '1/28/2020','21/1/2020', '1/25/2020', '29/1/2020'],
}

df = pd.DataFrame(data)

print(df)

补充示例

import pandas as pd

data = {'Tgl': {
  1: '1/1/2023',
  2: '1/1/2023',
  3: '1/3/2023',
  4: '1/5/2023',
  5: '1/5/2023',
  6: '1/9/2023',
  7: '10/1/2023',
  8: '12/1/2023',
  9: '16/1/2023'}}

df = pd.DataFrame(data)

解决方法

方法1:指定目标月份解析

利用已知的统一月份,对每个日期字符串尝试两种格式解析,保留月份匹配的结果:

import pandas as pd

def parse_mixed_dates(date_str, target_month):
    # 尝试月/日/年格式
    parse_mdy = pd.to_datetime(date_str, format='%m/%d/%Y', errors='coerce')
    # 尝试日/月/年格式
    parse_dmy = pd.to_datetime(date_str, format='%d/%m/%Y', errors='coerce')
    
    # 返回与目标月份匹配的解析结果
    if not pd.isna(parse_mdy) and parse_mdy.month == target_month:
        return parse_mdy
    elif not pd.isna(parse_dmy) and parse_dmy.month == target_month:
        return parse_dmy
    return pd.NaT  # 异常日期返回空值,可按需调整

# 示例1应用:目标月份为1月
df['parsed_date'] = df['date'].apply(lambda x: parse_mixed_dates(x, target_month=1))
df_sorted = df.sort_values('parsed_date')

# 补充示例应用:目标月份为1月
df['parsed_date'] = df['Tgl'].apply(lambda x: parse_mixed_dates(x, target_month=1))
df_sorted = df.sort_values('parsed_date')

方法2:自动识别目标月份

若未明确目标月份,可通过统计有效解析结果的月份,自动确定统一月份后完成解析:

import pandas as pd

# 生成两种格式的解析列
df['date_mdy'] = pd.to_datetime(df['date'], format='%m/%d/%Y', errors='coerce')
df['date_dmy'] = pd.to_datetime(df['date'], format='%d/%m/%Y', errors='coerce')

# 统计所有有效解析结果的月份,取出现次数最多的作为目标月份
all_valid_months = pd.concat([df['date_mdy'].dropna().dt.month, df['date_dmy'].dropna().dt.month])
target_month = all_valid_months.mode()[0]

# 合并正确的解析结果
df['parsed_date'] = df.apply(
    lambda row: row['date_mdy'] if not pd.isna(row['date_mdy']) and row['date_mdy'].month == target_month else row['date_dmy'],
    axis=1
)

# 排序并清理临时列
df_sorted = df.sort_values('parsed_date').drop(columns=['date_mdy', 'date_dmy'])

结果验证

以补充示例为例,解析排序后,10/1/2023(对应1月10日)会排在1/9/2023(对应1月9日)之后,符合日期升序逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:45:38