不依赖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
相关产品推荐
相关产品推荐

