Python中EDT时间字符串转DateTime报格式错误如何解决
问题原因
你编写的格式字符串本身没有语法错误,报错的核心疏漏是Python标准datetime.strptime的%Z标识符存在系统依赖限制:它仅能识别当前操作系统本地注册的时区缩写,如果你设备的默认时区不是北美东部时区,EDT这类非本地时区缩写会直接匹配失败,抛出格式错误。
另外你直接调用pd.to_datetime速度慢是因为没有手动指定格式,pandas自动推断日期格式会遍历所有数据做格式猜测,自然耗时久;精度丢失、时区警告也和未正确指定格式、默认时区处理逻辑有关。
解决方案
方法1:指定格式+时区映射(速度最快,精度无损失)
如果你的数据时区固定为EDT,推荐用该方案,全程无自动推断,性能远高于默认pd.to_datetime调用,完全保留原始精度:
import pandas as pd # 拆分原始时间字符串的时区部分和时间主体部分 time_split = tripOrig[' Time'].str.rsplit(' ', n=1, expand=True) time_body = time_split[0] # 指定格式转换时间主体,不需要处理时区所以不会报错 tripOrig['correct_date'] = pd.to_datetime(time_body, format='%d-%b-%Y %H:%M:%S.%f') # 给datetime列补时区信息,EDT对应America/New_York时区(自动适配夏令时/冬令时) tripOrig['correct_date'] = tripOrig['correct_date'].dt.tz_localize('America/New_York') # 转整数时间戳供ML使用,可按需选择单位,不会丢失秒级精度 # 示例转为微秒级整数: tripOrig['timestamp_int'] = tripOrig['correct_date'].astype('int64') // 1000 # 若只需要秒级整数,改为 // 10**9 即可
方法2:兼容多时区缩写方案
如果你的数据中存在多种不同时区缩写,可以用dateutil的解析器处理,无需手动拆分时区:
from dateutil import parser import pandas as pd # 配置时区缩写对应的偏移量,可按需扩展 tz_map = { "EDT": -4 * 3600, "EST": -5 * 3600 # 其他时区按格式补充即可 } # 批量转换 tripOrig['correct_date'] = tripOrig[' Time'].apply(lambda x: parser.parse(x, tzinfos=tz_map))
该方案适配性更强,批量处理速度略低于方法1。
内容的提问来源于stack exchange,提问作者Sam Dean
相关产品推荐
相关产品推荐

