本文要点
格式串由格式码和字面字符组成
格式串和字符串对不上时,strptime 会抛 ValueError
解析成功后,得到的是 datetime 对象,它和原来的字符串是两种东西

本文目录
先确定一件事:字符串里的日期顺序和格式串必须一一对应
如果你手里有一个日期字符串,比如 2024-03-15,想把它变成能参与比较、能取出年月的日期对象,第一步不是写代码,而是先把字符串拆成“哪一段是年、哪一段是月、哪一段是日”。
strptime 的作用就是按你给的格式串去解析字符串。格式串里的每个格式码对应字符串里的一个片段,顺序也要一致。字符串写的是 2024-03-15,格式串就得写成 %Y-%m-%d:%Y 对应四位年份,%m 对应两位月份,%d 对应两位日期,中间的连字符是字面字符,必须原样出现在字符串里。
本文只处理固定格式的日期字符串解析、按格式回写,以及格式不匹配时的排查。所有示例都是自建的练习数据,不涉及时区推断,也不处理“昨天”“下个月”这类相对时间。
动手前建议在练习目录里新建一个脚本文件,例如 exercise/parse_demo.py,不要拿真实业务数据直接试。
import datetime as dt
s = "2024-03-15"
d = dt.datetime.strptime(s, "%Y-%m-%d")
print(d)输出是 2024-03-15 00:00:00。注意这里得到的是 datetime 对象,没有写时间的字符串,时间部分默认是 0 点。这是自建示例,不是对某个真实数据的处理记录。
常用格式码对照:先认这七个,再扩展
格式串由格式码和字面字符组成。下面这张对照表是编辑整理的常用项,不是完整清单,但覆盖了大多数固定格式日期字符串。
- %Y:四位年份,例如 2024。
- %m:两位月份,例如 03。
- %d:两位日期,例如 15。
- %H:两位小时,24 小时制,例如 09。
- %M:两位分钟,例如 30。
- %S:两位秒,例如 45。
- %B:月份全名,例如 March。
对照的关键不是背下来,而是拿字符串去比:字符串里是 2024,就用 %Y;是 03,就用 %m;是 15,就用 %d。字符串里出现的是英文月份名 March,才用 %B,不能拿 %m 去接。
再看一个带时间的自建例子:
import datetime as dt
s = "2024-03-15 09:30:45"
d = dt.datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
print(d)输出是 2024-03-15 09:30:45。字符串里日期和时间之间有一个空格,格式串里也要有对应的空格。这个空格是字面字符,不是格式码,漏掉它就会解析失败。
格式不匹配会报什么错:从报错信息反推哪一段对不上
格式串和字符串对不上时,strptime 会抛 ValueError。这个报错信息本身会指出问题位置,值得先读一遍再改代码。
自建一个故意写错的例子:
import datetime as dt
try:
d = dt.datetime.strptime("2024/03/15", "%Y-%m-%d")
except ValueError as e:
print(e)字符串用的是斜杠,格式串用的是连字符,两者对不上,就会报错。报错信息里通常会带上“time data ... does not match format ...”这类提示,把字符串和格式串都列出来,方便你逐段比对。
排查顺序建议这样走:
1. 先看分隔符。字符串用斜杠还是连字符,格式串必须一致。
2. 再看位数。字符串里月份是 3 还是 03,会影响用 %m 还是别的写法。
3. 最后看有没有多余字符。字符串末尾多一个空格或句点,格式串里没有对应内容,同样会失败。
这里只讲格式不匹配这一类错误。字符串本身不是日期、月份超出范围这类情况,不在本文范围内。
解析出来的对象能做什么:取出年月日,而不是继续当字符串用
解析成功后,得到的是 datetime 对象,它和原来的字符串是两种东西。字符串只能做文本操作,datetime 对象可以取属性、做比较、算间隔。
自建示例:
import datetime as dt
d = dt.datetime.strptime("2024-03-15", "%Y-%m-%d")
print(d.year)
print(d.month)
print(d.day)输出分别是 2024、3、15。注意 month 和 day 输出的是整数 3 和 15,不带前导零。这是对象属性和字符串片段的一个区别:字符串里的 03 是文本,对象里的 month 是整数。
如果你只是想把日期换个写法显示,不需要先解析再拼字符串,可以直接用 strftime 回写,下一节讲。
strftime 回写:把对象按你指定的格式变回字符串
strftime 和 strptime 方向相反:strptime 是字符串进、对象出,strftime 是对象进、字符串出。格式码的写法是同一套。
自建示例:
import datetime as dt
d = dt.datetime.strptime("2024-03-15", "%Y-%m-%d")
print(d.strftime("%Y年%m月%d日"))
print(d.strftime("%d/%m/%Y"))第一行输出 2024年03月15日,第二行输出 15/03/2024。同一个对象,换格式串就换写法。
回写时要注意两点。第一,格式串里的中文字符、斜杠、连字符都是字面字符,会原样出现在结果里。第二,%m 和 %d 回写时通常带前导零,如果字符串里原本是 3 而不是 03,回写结果可能和原字符串不完全一样。这不是错误,是格式码本身的输出规则。
如果你需要“解析进来、再按原样写回去”,最稳妥的做法是解析和回写用同一个格式串,这样输出和输入的写法一致。
一个完整的往返练习:解析、检查、回写
把前面几步串起来,做一个自建的往返练习。目标是:给定一个固定格式的日期字符串,解析成对象,检查取出的年月日对不对,再按指定格式回写。
import datetime as dt
raw = "2024-03-15"
fmt = "%Y-%m-%d"
d = dt.datetime.strptime(raw, fmt)
assert d.year == 2024
assert d.month == 3
assert d.day == 15
back = d.strftime(fmt)
print(back)输出是 2024-03-15,和输入一致。这里的 assert 是自建的检查手段,用来确认解析结果符合预期,不是对任何真实数据的验证。
这个练习的价值在于:它把“解析对不对”变成一个可以当场看结果的动作。如果 assert 失败,说明格式串和字符串的对应关系有问题,回到上一节的排查顺序去查。
使用限制:只处理固定格式,不做时区推断
本文的范围限定在固定格式的日期字符串解析和回写。以下几点需要提前说清楚。
第一,strptime 要求格式串和字符串严格对应。它不会自动猜格式,也不会容忍多种分隔符混用。字符串格式不固定时,需要先统一格式,或者分别写多个格式串去尝试。
第二,本文所有示例都不处理时区。解析出来的对象不带时区信息,回写也不会附加时区偏移。如果你的场景涉及时区转换,需要另外处理,本文不展开。
第三,格式码不止本文列出的七个。月份缩写、星期、上下午标记等都有对应格式码,需要时查阅官方文档的格式码表。
第四,所有示例都是自建的练习数据,文件名和内容仅用于演示,不代表任何真实业务记录。练习时建议在单独的练习目录里操作,不要直接修改重要文件。
参考资料:Python 官方文档 datetime 模块中关于 strptime 和 strftime 的说明,地址见 source 字段。
观看知识要点视频 18 秒
18秒无旁白要点导览,文字来自已审核正文;完整步骤、条件及参考资料见下方。
参考资料
以下原始资料提供本文依据;请结合日期、适用条件和产品说明查阅。
请结合原始资料的适用条件阅读。
返回表格与数据 →