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

Pandas:按年份倒序重排列,非日期列前置(大小写不敏感)

问题描述

需要处理字典形式的表格数据,满足以下要求:

  • 所有非日期列移至数据最左侧
  • 表头为「月份 年份」格式的日期列,按降序从左到右排列
  • 处理时忽略表头的大小写差异

示例输入:

demo = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40],
    'Apr 2022': ['New', 'Los', 'Chic', 'Hous'],
    'aPRil 2024': ['York', 'Anges', 'cago', 'ston'],
    'Vanilla': ['nfd', 'bdfh', 'tyii', 'liu'],
    'aUg 2023': ['NewYork', 'LosAngeles', 'Chicago', 'Houston'],
    'deC 2022': ['Neork', 'Logeles', 'Chago', 'Hoston']
}

预期输出:

result = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40],
    'Vanilla': ['nfd', 'bdfh', 'tyii', 'liu'],
    'aPRil 2024': ['York', 'Anges', 'cago', 'ston'],
    'aUg 2023': ['NewYork', 'LosAngeles', 'Chicago', 'Houston'],
    'deC 2022': ['Neork', 'Logeles', 'Chago', 'Hoston'],
    'Apr 2022': ['New', 'Los', 'Chic', 'Hous']
}
解决方案

使用Python结合datetime模块可以轻松实现需求,代码如下:

from datetime import datetime

def is_date_column(col_name):
    # 尝试解析列名为"月份缩写 年份"格式,忽略大小写
    try:
        datetime.strptime(col_name.strip(), '%b %Y')
        return True
    except ValueError:
        return False

# 分离非日期列与日期列
non_date_cols = [col for col in demo.keys() if not is_date_column(col)]
date_cols = [col for col in demo.keys() if is_date_column(col)]

# 对日期列按实际日期降序排序,保留原列名大小写
date_cols_sorted = sorted(
    date_cols,
    key=lambda x: datetime.strptime(x.strip(), '%b %Y'),
    reverse=True
)

# 按要求重组列顺序并生成结果字典
result = {col: demo[col] for col in non_date_cols + date_cols_sorted}
代码说明
  1. 列类型判断:is_date_column函数通过datetime.strptime尝试解析列名,%b匹配英文月份缩写(自动忽略大小写),解析成功则判定为日期列
  2. 列分离:用列表推导式分别筛选出非日期列和日期列,非日期列保留原有的相对顺序
  3. 日期列排序:使用sorted函数,以解析后的日期对象作为排序依据,reverse=True实现降序排列,确保年份大的列排在前面,同年份则月份大的列在前
  4. 重组字典:按照「非日期列 + 排序后日期列」的顺序生成新字典,完全保留原数据的内容和列名的大小写格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 01:00:02