如何在Python中从日期时间字符串推断类型并区分日期、时间、时间戳
自动推断字符串的日期/时间/时间戳类型
我懂你的困扰——用datetime模块时,因为输入格式太杂没法固定解析,导致没法自动区分日期、时间和时间戳。刚好你的需求很明确,咱们可以用按优先级尝试匹配格式的思路解决,直接上干货:
核心思路
得按「范围从大到小」的优先级判断,避免误判:
- 先判断时间戳:包含日期+时间(可能带毫秒),如果先判断日期,会把时间戳里的日期部分误判成纯日期
- 再判断时间:只有时分秒的字符串
- 最后判断日期:只有年月日相关的字符串
可直接运行的代码
from datetime import datetime def infer_datetime_type(input_str): # 先匹配时间戳格式(覆盖带/不带毫秒、两位/四位年份的情况) timestamp_patterns = [ "%y-%m-%d %H:%M:%S", "%y-%m-%d %H:%M:%S.%f", "%Y-%m-%d %H:%M:%S", "%Y-%m-%d %H:%M:%S.%f" ] for pattern in timestamp_patterns: try: datetime.strptime(input_str, pattern) return "timestamp" except ValueError: pass # 接着匹配纯时间格式 time_patterns = ["%H:%M:%S"] for pattern in time_patterns: try: datetime.strptime(input_str, pattern) return "time" except ValueError: pass # 最后匹配纯日期格式(覆盖带th后缀、不同顺序的日期) date_patterns = [ "%dth %b %Y", "%b %dth %Y", "%y-%m-%d", "%Y-%m-%d" ] for pattern in date_patterns: try: datetime.strptime(input_str, pattern) return "date" except ValueError: pass # 如果所有格式都不匹配,返回unknown(可根据需求调整) return "unknown" # 测试你的输入列表 input_list = [ "4th Sep 2013", "95-04-04 23:33:05", "May 5th 1999", "03:00:00", "10-01-22", "12-12-25 05:48:01.0010"] output_types = [infer_datetime_type(item) for item in input_list] print(output_types) # 输出正好是你要的: ['date', 'timestamp', 'date', 'time', 'date', 'timestamp']
额外说明
- 格式可扩展:之后遇到新的日期/时间格式,直接往对应的
_patterns列表里加就行,比如要支持中文月份,就加"%Y年%m月%d日"这种格式 - 模糊格式处理:如果遇到像
01-02-03这种可能是日-月-年也可能是月-日-年的模糊格式,你可以根据业务上下文加额外判断逻辑(比如约定年份在后) - 异常处理:用
try-except捕获strptime的格式不匹配异常,是处理这种多格式场景的标准做法
内容的提问来源于stack exchange,提问作者Will Bryant
相关产品推荐
相关产品推荐

