Python中如何处理非标准时间格式(如2017-9-5 12:00:00)转换为标准时间?
比如采集的时间格式:2017-9-5 12:00:00,对于这种非标准的时间怎么处理成标准时间格式?
- 直接 datetime 包处理?好像不行,因为%m 对应的是 01-12,%d 对应 01-31
- 对这种时间先拆分再处理拼接?好像可以,不过麻烦点。比如:
ftime='2017-9-5 12:00:00'
date,time=ftime.split(' ')
year,month,day=date.split('-')
if len(month)==1:
month='0'+month
if len(day)==1:
day='0'+day
ftime2='-'.join([year,month,day])+' '+time

对于第 2 种方法,我是不满意的。不知道有没有更简便的方法?
Python中如何处理非标准时间格式(如2017-9-5 12:00:00)转换为标准时间?
15 回复
>>> datetime.datetime.strptime(“2017-9-5 12:30:45”, “%Y-%m-%d %H:%M:%S”)
datetime.datetime(2017, 9, 5, 12, 30, 45)
from datetime import datetime
# 原始非标准时间字符串
time_str = "2017-9-5 12:00:00"
# 方法1:使用datetime.strptime()指定格式
try:
dt = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S")
print(f"方法1转换结果: {dt}")
except ValueError as e:
print(f"格式不匹配: {e}")
# 方法2:使用dateutil.parser(需要安装:pip install python-dateutil)
try:
from dateutil import parser
dt2 = parser.parse(time_str)
print(f"方法2转换结果: {dt2}")
except ImportError:
print("请先安装python-dateutil: pip install python-dateutil")
# 方法3:处理更灵活的非标准格式
def flexible_parse(time_string):
# 替换可能的格式变体
replacements = [
('年', '-'), ('月', '-'), ('日', ''),
('/', '-'), (' ', ' ') # 处理多余空格
]
cleaned = time_string
for old, new in replacements:
cleaned = cleaned.replace(old, new)
# 尝试多种格式
formats = [
"%Y-%m-%d %H:%M:%S",
"%Y-%m-%d %H:%M",
"%Y-%m-%d",
"%Y/%m/%d %H:%M:%S",
"%Y.%m.%d %H:%M:%S"
]
for fmt in formats:
try:
return datetime.strptime(cleaned.strip(), fmt)
except ValueError:
continue
raise ValueError(f"无法解析时间字符串: {time_string}")
# 测试不同格式
test_cases = [
"2017-9-5 12:00:00",
"2017/09/05 12:00",
"2017.9.5",
"2017年9月5日 12:00:00"
]
print("\n方法3测试:")
for test in test_cases:
try:
result = flexible_parse(test)
print(f"{test} -> {result}")
except ValueError as e:
print(f"解析失败: {test} - {e}")
# 转换为标准ISO格式
if 'dt' in locals():
iso_format = dt.isoformat()
print(f"\nISO标准格式: {iso_format}")
核心方案:
- 明确格式时:用
datetime.strptime()直接指定格式字符串 - 格式多变时:用
dateutil.parser.parse()自动解析(需安装第三方库) - 自定义处理:写个清洗函数先规范化字符串再尝试多种格式
简单建议: 明确格式就用strptime,不确定就用dateutil。
python 文档里描述得不是特别清晰,实际上是可以用的
#1 居然可以这样。我应该先试试的。谢谢啦
#3 不用自作聪明。我问之前肯定有搜文档
有的,使用 pandas 的 Timestamp
import pandas as pd
pd.Timestamp(“2017-9-5 13:05”)
你会的到你想要的
果然还是 PHP 最好
date(‘Y-m-d H:i:s’, strtotime(‘2017-9-5 12:00:00’))
#6 一楼已经解决了。datetime 也可以处理
一楼的解决方案需要你指定格式,我给出的这个,你不需要指定格式的。哪怕你用 2017/9/5 它也能正确识别
现在 v 站越来越多三楼这种人
block 了
#9 啊!厉害了,谢谢
<br>$ pip install arrow<br>
放弃 date 和 time 转到 arrow 吧…
突然发现 arrow.get()也拿不到这句话…
这种情况,除了 的说明。还有几个库。
Python-dateutil
pytz
arrow

