Python:含可选毫秒的字符串转datetime 大数据场景最优方案
大数据场景下统一时间格式并转换的最优方案
针对两种时间格式不兼容导致转换报错的问题,大数据场景下必须用矢量化操作(避免逐行处理的apply)保证效率,以下是两种最优实现方式:
方案1:正则统一字符串格式后指定转换(性能最优)
先通过正则替换补全缺失的毫秒部分,让所有字符串统一为%Y-%m-%dT%H:%M:%S.%fZ格式,再用指定格式转换,速度最快,适合超大规模数据集:
import pandas as pd from datetime import timedelta # 补全无毫秒的时间字符串 df['datetime_string'] = df['datetime_string'].str.replace( r'(\d{2}:\d{2}:\d{2})Z$', # 匹配"时分秒Z"结尾的无毫秒格式 r'\1.000000Z', # 替换为带6位毫秒的格式 regex=True ) # 转换为datetime并添加60天 df['datetime'] = pd.to_datetime(df['datetime_string'], format="%Y-%m-%dT%H:%M:%S.%fZ") + timedelta(days=60)
方案2:利用pandas自动推断格式(代码最简洁)
pandas的to_datetime支持自动推断多种时间格式,加上infer_datetime_format=True参数后会批量推断格式,性能接近方案1,代码更简洁:
import pandas as pd from datetime import timedelta # 直接转换并添加60天,无需手动处理字符串 df['datetime'] = pd.to_datetime(df['datetime_string'], infer_datetime_format=True) + timedelta(days=60)
注意事项
- 绝对不要用
df.apply(lambda x: ...)逐行处理,大数据下速度会慢几个数量级; - 两种方案都是矢量化操作,能充分利用pandas的底层C扩展优化,适配百万级以上数据集;
- 如果数据集有极端异常格式,方案1的正则替换可更精准过滤处理,方案2则容错性更强。
内容的提问来源于stack exchange,提问作者NewUser
相关产品推荐
相关产品推荐

