Python 中的 date() 是 datetime 模块中专门处理日期(年、月、日)的类,它不包含时间信息,是应对日期计算、转换和格式化最直接的工具。 无论你是刚入门的新手,还是已经在数据清洗、Web 开发中摸爬滚打多年的老手,准确操作日期都是一项躲不开的基本功,date() 的设计初衷就是让你只关心年月日,不用被时分秒干扰,这让代码更干净,逻辑更清晰。
Python date() 怎么用?从创建到格式化一篇文章搞定
很多人第一次接触 date() 时,最直接的问题就是“怎么创建出来”,Python 的 date 类提供了几种非常直观的创建方式,掌握它们之后,你就能在任意场景下快速拿到需要的日期对象。
创建 date 对象的三种方式
- 通过指定年月日创建:直接调用
date(year, month, day),date(2026, 3, 15)会生成一个代表 2026 年 3 月 15 日的对象,这是最基础的方式,跟你手写日历一样自然。 - 获取系统当前日期:
date.today()是最常用的方法,它自动读取你的电脑时钟,返回当天的日期对象,写日志、记录数据更新时间时,这个命令几乎是标配。 - 从时间戳转换:如果你手里有一个 Unix 时间戳,可以用
date.fromtimestamp(timestamp)将其转成日期对象,这在处理日志文件或 API 返回的时间数据时特别方便。
从对象中提取你需要的信息
创建好 date 对象之后,你的下一步通常是拿到具体的年、月、日或者把它转成字符串以便展示,date 对象内置了三个属性:year、month、day,直接取值就行。today = date.today(),today.year 就能拿到当前年份。
如果需要把日期按特定格式输出,就要用到 strftime 方法,它接受一个格式字符串,%Y-%m-%d 会输出 2026-03-15,%B %d, %Y 则输出 March 15, 2026,行业共识认为,在只关心日期而不需要时间时,使用 date() 比 datetime() 更轻量且语义清晰,尤其是在报表生成和数据导出场景中,这种纯净的日期对象能避免很多类型混淆。
日期计算与比较
date 对象支持加减操作,这得益于 timedelta 的配合,例如你想算三天后的日期,直接 date.today() + timedelta(days=3) 即可,两个日期之间也能直接相减,得到 timedelta 对象,里面包含天数差距,这种设计让代码读起来像自然语言,如果过期日期小于今天,则标记为已过期”这种逻辑,用 if expire_date < date.today() 就能实现,非常直观。
Python date 与 datetime 的区别:对比分析帮你做出选择
很多初学者搞不清 date 和 datetime 的区别,选错之后导致代码里多了不必要的转换,其实它们的核心差异非常清晰。
本质区别:是否包含时间
| 特性 | date | datetime |
|---|---|---|
| 包含信息 | 年、月、日 | 年、月、日、时、分、秒、微秒 |
| 创建方式 | date(2026, 3, 15) | datetime(2026, 3, 15, 14, 30, 0) |
| 常用场景 | 生日、账单日、截止日期 | 事件时间戳、日志记录、定时任务 |
业内专家指出,在只需要日期维度进行统计分析时,滥用 datetime 会引入不必要的时区问题和内存占用,例如在数据清洗中,如果只关心“用户在哪一天注册”,那么直接用 date() 存储,既节省空间又避免后续对时间部分的无意义处理。
如何选择
- 如果业务逻辑里“时间”根本不会出现,比如计算两个日期之间的天数差、判断是否在某个日期范围内,直接用 date()。
- 如果你需要记录精确到秒的操作时间,比如用户下单时间、服务器日志,那必须用 datetime()。
- 当你的数据源是字符串时,需要先用
strptime解析成 datetime 对象,然后通过.date()方法提取日期部分,这个转换在数据清洗中非常常见。
实战:Python date() 在数据清洗与开发中的具体用法
理论知识放在一边,我们直接看几个实际工作中会用到的操作步骤。
从日期字符串中提取年份用于分组
在数据分析中,你经常遇到一堆日期字符串,2026-03-15,然后需要按年份统计,操作路径如下:
- 用
datetime.strptime(date_str, '%Y-%m-%d')将字符串转成 datetime 对象。 - 调用
.date()拿到 date 对象,再取.year属性。 - 将年份作为分组键,进行聚合计算。
这种模式在 Pandas 的 apply 函数里也通用,配合 lambda 一行就能搞定。
判断当前日期是否在有效期内
假设你有一个商品促销表,里面有促销开始日期和结束日期(date 对象),你需要筛选出今天有效的促销:
- 获取
today = date.today() - 条件
start_date <= today <= end_date - 使用列表推导式或 DataFrame 布尔索引过滤。
许多新手会在这里犯一个错误:直接用字符串比较,字符串比较在年月日格式固定时偶尔能蒙对,但只要月份或日期不是两位数,结果就会乱,用 date 对象比较是唯一可靠的方式。
生成连续日期序列
在绘制时间序列图或准备日报数据时,你需要生成从某天到今天的所有日期,可以用循环:
from datetime import date, timedelta
start = date(2026, 1, 1)
end = date.today()
step = timedelta(days=1)
dates = []
while start <= end:
dates.append(start)
start += step
这段代码简单直接,也是面试中常被问到的日期迭代问题,更高效的方式是用 Pandas 的 date_range,但理解底层逻辑对排查 bug 很有帮助。
常见错误与调试技巧
在写日期相关的代码时,有几个坑踩的人特别多,我列出来你可以对照自查。
- 月份和日期忘记补零:
%m和%d默认是两位数,如果你传'2026-3-5',解析会报错,此时格式字符串应该用
%Y-%m-%d还是%Y-%-m-%-d?不同系统下%-m的行为不同,最稳妥的办法是先用split或正则规整为统一格式,再解析。 - 时区混淆:date() 本身不带时区,但如果你从带时区的时间戳转换,要注意
fromtimestamp默认使用本地时区,如果需要 UTC 日期,使用datetime.utcnow().date()。 - 跨年计算:
timedelta会自动处理跨年和闰年,date(2026, 12, 31) + timedelta(days=1)会正确返回2027-01-01,但如果你手动计算天数,很容易疏忽闰年,所以永远不要自己写天数加减逻辑。
Python date() 常见问题解答
date() 和 datetime() 在性能上有明显差异吗?
如果只是单纯创建对象,差异微乎其微,但在批量处理大量日期数据时,比如百万级日志,date 对象占用的内存更少,且不需要处理时间部分,操作速度会略快,不过这种差异通常不是瓶颈,选择哪个更取决于你的业务是否需要时间信息。
如何将 date 对象转换为字符串并指定格式?
直接调用 strftime 方法,传入格式指令,常用指令有 %Y(四位数年份)、%m(两位数月份)、%d(两位数日期)、%A(星期全名)、%B(月份全名)。date(2026, 3, 15).strftime('%Y年%m月%d日') 得到 2026年03月15日。
两个 date 对象相减得到的是什么?
得到的是一个 timedelta 对象,它的 .days 属性包含相差的天数,注意,timedelta 只存储天数和秒数,如果两个日期相隔超过 999999999 天,会溢出,但实际项目中几乎不会遇到这种情况。
最后,date() 模块虽然小,但它是 Python 处理日期体系的基石,花十分钟把它的创建、提取、格式化、比较这四个环节练熟,之后玩转时间序列、定时任务甚至数据可视化都会顺畅很多。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/505673.html



