如何用Python将多种格式时间戳转换为Hive表兼容格式
多格式时间戳转Hive兼容格式的Python实现方案
核心思路
针对每种待处理的时间格式,预先定义对应的解析模板,通过遍历模板逐个尝试解析原始时间字符串,成功解析后再转换为Hive支持的yyyy-MM-dd HH:mm:ss.SSS格式。这种方式比自动解析更精准,能避免格式歧义问题。
具体实现步骤
1. 定义时间格式模板列表
把你遇到的7-8种时间格式对应的strftime解析模板整理出来,示例如下:
from datetime import datetime # 替换为你实际遇到的所有时间格式模板 TIME_FORMATS = [ "%Y%m%d:%H:%M:%S.%f", # 示例:20210811:12:55:56.563 "%d/%m/%Y %H:%M:%S.%f", # 示例:25/05/1999 02:35:05.532 "%Y-%m-%d %H:%M:%S.%f", # 已符合目标格式的情况 "%d-%m-%Y %H:%M:%S", # 不带毫秒的dd-MM-yyyy格式 "%Y%m%d%H%M%S%f", # 无分隔符的紧凑格式:20210811125556563 "%m/%d/%Y %I:%M:%S %p", # 带AM/PM的格式:08/11/2021 12:55:56 PM # 继续添加其他格式模板 ]
2. 编写转换函数
遍历模板列表尝试解析,成功后转换为目标格式:
def convert_to_hive_compatible_time(raw_time_str): TARGET_FORMAT = "%Y-%m-%d %H:%M:%S.%f" for fmt in TIME_FORMATS: try: # 解析原始时间字符串 dt = datetime.strptime(raw_time_str, fmt) # 格式化后截取前三位毫秒(%f会输出6位微秒,Hive仅需三位) return dt.strftime(TARGET_FORMAT)[:-3] except ValueError: # 当前模板不匹配,继续尝试下一个 continue # 所有模板都匹配失败时,根据业务需求处理(此处抛出异常) raise ValueError(f"无法解析时间字符串:{raw_time_str}")
3. 测试验证
# 测试示例 print(convert_to_hive_compatible_time("20210811:12:55:56.563")) # 输出:2021-08-11 12:55:56.563 print(convert_to_hive_compatible_time("25/05/1999 02:35:05.532")) # 输出:1999-05-25 02:35:05.532
补充说明
- 如果涉及带时区的时间戳,需用
pytz或zoneinfo模块将时间转换为目标时区(比如UTC)后再格式化。 - 若想简化模板定义,也可以使用
dateutil.parser.parse自动解析,但要注意该方法可能存在格式歧义(如05/06/2023可能被解析为5月6日或6月5日),建议优先使用自定义模板列表。 - 对解析失败的异常,可根据业务需求改为返回
None或记录日志,方便后续排查问题。
内容的提问来源于stack exchange,提问作者Mayank Upadhyay
相关产品推荐
相关产品推荐

