本文目录导读:

- 使用标准库
datetime.strptime() - 使用
dateutil.parser(推荐) - 处理陌生格式的策略
- 使用第三方库
pendulum - 使用
arrow库 - 完整的智能解析器示例
- 安装依赖
- 总结建议
我来系统地介绍Python解析各种陌生时间格式的方法。
使用标准库 datetime.strptime()
最基础的方法,需要知道时间格式:
from datetime import datetime # 已知格式的时间字符串 date_str = "2023-12-25 14:30:00" parsed = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S") print(parsed) # 2023-12-25 14:30:00
常用格式化代码:
%Y- 4位年份%m- 月份 (01-12)%d- 日期 (01-31)%H- 小时 (00-23)%M- 分钟 (00-59)%S- 秒 (00-59)
使用 dateutil.parser (推荐)
自动解析多种常见格式:
from dateutil import parser
# 各种常见格式
formats = [
"2023-12-25 14:30:00",
"12/25/2023 2:30 PM",
"Dec 25, 2023 14:30",
"202312251430",
"2023-12-25T14:30:00Z",
"25-12-2023 14:30",
"Mon, 25 Dec 2023 14:30:00 +0800"
]
for fmt in formats:
try:
dt = parser.parse(fmt)
print(f"'{fmt}' -> {dt}")
except Exception as e:
print(f"无法解析: {fmt}, 错误: {e}")
处理陌生格式的策略
1 格式猜测器
import re
from datetime import datetime
def guess_and_parse(date_str):
"""尝试识别并解析时间字符串"""
# 定义可能的格式模式
patterns = [
# ISO格式
(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$', '%Y-%m-%dT%H:%M:%SZ'),
(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2}$', '%Y-%m-%dT%H:%M:%S%z'),
# 常见分隔符格式
(r'^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$', '%Y-%m-%d %H:%M:%S'),
(r'^\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}$', '%Y/%m/%d %H:%M:%S'),
# 紧凑格式
(r'^\d{14}$', '%Y%m%d%H%M%S'),
(r'^\d{8}$', '%Y%m%d'),
(r'^\d{6}$', '%y%m%d'),
# 12小时制
(r'^\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2} (AM|PM)$', '%m/%d/%Y %I:%M %p'),
]
for pattern, fmt in patterns:
if re.match(pattern, date_str):
try:
return datetime.strptime(date_str, fmt)
except ValueError:
continue
return None
# 测试
test_dates = [
"2023-12-25T14:30:00Z",
"20231225143000",
"12/25/2023 2:30 PM",
"2023-12-25 14:30:00"
]
for date in test_dates:
result = guess_and_parse(date)
print(f"{date} -> {result}")
2 多格式尝试解析器
def robust_parse(date_str):
"""尝试多种格式解析时间字符串"""
formats = [
# 标准格式
"%Y-%m-%d %H:%M:%S",
"%Y-%m-%dT%H:%M:%S",
"%Y/%m/%d %H:%M:%S",
"%m/%d/%Y %H:%M:%S",
"%d/%m/%Y %H:%M:%S",
# 年月日
"%Y-%m-%d",
"%Y/%m/%d",
"%d-%m-%Y",
"%m-%d-%Y",
"%Y%m%d",
# 带时区
"%Y-%m-%dT%H:%M:%S%z",
"%Y-%m-%dT%H:%M:%SZ",
# 12小时制
"%I:%M:%S %p",
"%Y-%m-%d %I:%M:%S %p",
# 月日年 
"%b %d %Y %H:%M:%S",
"%d %b %Y %H:%M:%S",
"%B %d %Y %H:%M:%S",
]
for fmt in formats:
try:
return datetime.strptime(date_str, fmt)
except ValueError:
continue
# 最后尝试用dateutil
try:
from dateutil import parser
return parser.parse(date_str, fuzzy=True)
except:
raise ValueError(f"无法解析时间字符串: {date_str}")
# 使用示例
test_cases = [
"2023-12-25 14:30:00",
"Dec 25 2023 14:30:00",
"12/25/2023 02:30:00 PM",
"2023-12-25T14:30:00+08:00"
]
for case in test_cases:
try:
dt = robust_parse(case)
print(f"'{case}' -> {dt}")
except ValueError as e:
print(f"错误: {e}")
使用第三方库 pendulum
更好的时区和格式处理:
import pendulum
# 自动解析
dt = pendulum.parse("2023-12-25 14:30:00")
print(dt) # 2023-12-25T14:30:00+00:00
dt = pendulum.parse("12/25/2023 2:30 PM")
print(dt)
# 带时区
dt = pendulum.parse("2023-12-25T14:30:00+08:00")
print(dt)
使用 arrow 库
import arrow
# 自动解析
dt = arrow.get("2023-12-25 14:30:00")
print(dt)
# 更多格式
formats = [
"YYYY-MM-DD HH:mm:ss",
"YYYY/MM/DD HH:mm:ss",
"DD/MM/YYYY HH:mm:ss"
]
for fmt in formats:
try:
dt = arrow.get("25/12/2023 14:30:00", fmt)
print(dt)
except:
continue
完整的智能解析器示例
import re
from datetime import datetime
from dateutil import parser as dateutil_parser
class SmartDateTimeParser:
"""智能时间解析器"""
def __init__(self):
self.custom_patterns = {}
def add_pattern(self, name, regex, format_str):
"""添加自定义解析模式"""
self.custom_patterns[name] = (regex, format_str)
def parse(self, date_str, fuzzy=False):
"""解析时间字符串"""
# 1. 尝试预定义模式
if self.custom_patterns:
for name, (regex, fmt) in self.custom_patterns.items():
if re.match(regex, date_str):
try:
return datetime.strptime(date_str, fmt)
except ValueError:
continue
# 2. 尝试dateutil自动解析
try:
return dateutil_parser.parse(date_str, fuzzy=fuzzy)
except:
pass
# 3. 尝试常见格式
common_formats = [
"%Y-%m-%d %H:%M:%S",
"%Y/%m/%d %H:%M:%S",
"%m/%d/%Y %H:%M:%S",
"%d-%m-%Y %H:%M:%S",
"%Y%m%d%H%M%S",
"%Y-%m-%d",
"%d/%m/%Y",
]
for fmt in common_formats:
try:
return datetime.strptime(date_str, fmt)
except ValueError:
continue
raise ValueError(f"无法解析时间格式: {date_str}")
# 使用示例
parser = SmartDateTimeParser()
# 添加自定义格式
parser.add_pattern(
"custom_ts",
r'^\d{4}\.\d{2}\.\d{2}_\d{2}-\d{2}-\d{2}$',
'%Y.%m.%d_%H-%M-%S'
)
# 测试
test_times = [
"2023.12.25_14-30-00", # 自定义格式
"2023-12-25 14:30:00", # 标准格式
"Dec 25, 2023 2:30 PM", # dateutil格式
]
for t in test_times:
try:
result = parser.parse(t, fuzzy=True)
print(f"'{t}' -> {result}")
except ValueError as e:
print(f"解析失败: {e}")
安装依赖
pip install python-dateutil pendulum arrow
总结建议
- 优先使用
dateutil.parser- 能解析90%的常见格式 - 预先定义已知格式 - 对特定数据源使用
strptime - 实现多格式尝试 - 对未知格式进行轮询尝试
- 正则表达式辅助 - 先用正则判断格式类型
- 考虑使用专用库 -
pendulum、arrow等提供了更好的API
这样就能处理绝大部分陌生时间格式了。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播