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

不依赖locale转换DataFrame英文缩写日期索引为datetime及相关问题

解答:英文缩写日期转datetime(不依赖locale)及相关疑问

问题1:是否确实无法在不依赖locale的情况下使用Python标准库完成该转换?

可以实现。英文月份缩写是固定的,我们可以手动构建月份映射字典,拆分日期字符串后自行转换,完全不依赖系统locale设置。示例代码:

from datetime import datetime

month_map = {
    'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4,
    'May': 5, 'Jun': 6, 'Jul': 7, 'Aug': 8,
    'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12
}

def str_to_date(date_str):
    month_abbr, day, year = date_str.split()
    day = int(day.strip(','))
    year = int(year)
    return datetime(year, month_map[month_abbr], day)

# 测试
print(str_to_date("Feb 10, 2024"))  # 输出: 2024-02-10 00:00:00

问题2:是否有更优/更简洁的替代方案?

除你提到的arrow和dateparser,推荐两种高效简洁的方案:

  • 方案A:pandas内置方法配合自定义解析
    利用pd.to_datetime的date_parser参数传入自定义函数,无需额外安装第三方库(仅依赖pandas),速度优于dateparser:
import pandas as pd
from datetime import datetime

month_map = {
    'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4,
    'May': 5, 'Jun': 6, 'Jul': 7, 'Aug': 8,
    'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12
}

def parse_date(date_str):
    month_abbr, day, year = date_str.split()
    return datetime(int(year), month_map[month_abbr], int(day.strip(',')))

# 应用到DataFrame索引
data.index = pd.to_datetime(data.index, date_parser=parse_date)
  • 方案B:简化arrow的使用
    arrow本身性能优异、语法清晰,可直接用批量映射转换,是推荐的简洁方案:
data.index = data.index.map(lambda x: arrow.get(x, "MMM D, YYYY", locale="en_US").datetime)

问题3:为什么pd.read_excel的converters参数对索引日期无效?

converters参数仅作用于普通数据列,当你指定index_col=0时,第0列会被直接作为索引加载,不会经过converters的处理流程。

如果要在读取阶段完成索引转换,可分两步操作:

import pandas as pd
import arrow

path = r"some_path"
# 先不指定index_col,将第0列作为普通列转换
data = pd.read_excel(path, header=[0,1,2,3], converters={0: lambda x: arrow.get(x, "MMM D, YYYY", locale="en_US").datetime})
# 将转换后的列设为索引
data = data.set_index(0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:19:59