Python中如何处理非标准时间格式(如2017-9-5 12:00:00)转换为标准时间?

比如采集的时间格式:2017-9-5 12:00:00,对于这种非标准的时间怎么处理成标准时间格式?

  1. 直接 datetime 包处理?好像不行,因为%m 对应的是 01-12,%d 对应 01-31
  2. 对这种时间先拆分再处理拼接?好像可以,不过麻烦点。比如:
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

6286d3d1-610d-48e6-9dc6-3cb85b8ffe05.png

对于第 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}")

核心方案:

  1. 明确格式时:用datetime.strptime()直接指定格式字符串
  2. 格式多变时:用dateutil.parser.parse()自动解析(需安装第三方库)
  3. 自定义处理:写个清洗函数先规范化字符串再尝试多种格式

简单建议: 明确格式就用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

回到顶部