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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:00:58