datetime是Python标准库,家喻户晓。
python-dateutil是一个开源Python库,提供标准datetime模块的强大扩展。主要功能包括相对日期计算、通用日期解析、递归规则生成和时区处理。

一. python-dateutil常规数据
项目始于2003年,由多个贡献者维护,目前最新版本为2.9.0.post0,
发布于2024年3月1日。代码托管在GitHub,仓库有2600多个星标,支持Python 2.7和3.3-3.12版本。
从流行度看,PyPI数据显示,总下载量超210亿次,2026年1月单月下载量约7.17亿次。这得益于它是许多热门库的依赖,如pandas、boto3和matplotlib,常在数据处理、API调用和脚本自动化中被间接使用。

二. python-dateutil亮点介绍
python-dateutil的核心亮点在于扩展datetime的功能,让日期处理更灵活高效。主要模块包括relativedelta、parser、rrule和tz。
relativedelta支持相对日期计算,如计算“下个月第一天”或“上周最后一天”。
parser模块能从任意字符串解析日期,支持模糊输入如“next Friday”或“3 days ago”。
rrule实现递归规则,生成如“每周一上午9点”的序列,兼容iCalendar标准。
tz模块处理时区,支持Olson数据库、Windows注册表和TZ环境变量。
1. parser:最强大的日期字符串解析(模糊/自然语言都行)
测试结果:
以下几种可以解析:
from dateutil.parser import parse# 各种乱七八糟的输入都能解析print(parse("2026-01-30")) # 标准ISOprint(parse("Jan 30, 2026")) # 英文缩写print(parse("30/01/2026")) # 日/月/年print(parse("2026-01-30 09:19 AM CST")) # 带时区# 带时区信息dt = parse("2026-01-30 09:19 AM CST", tzinfos={"CST": -6*3600})print(dt)# 2026-01-30 09:19:00-06:00
以下几种不可以解析:(试过一些其他办法,但效果不佳,或者过于繁琐,不推荐,尽量还是手动转换成标准模式)
print(parse("下午3点半")) # 中文自然语言(部分支持)print(parse("next Friday at 9am")) # 相对日期print(parse("3 days ago")) # 相对时间
2. relativedelta:相对日期计算(比 timedelta 强大多了)
from dateutil.relativedelta import relativedeltafrom datetime import datetimenow = datetime(2026, 1, 30, 9, 19)# 加/减月、年、周(自动处理月末、闰年)print(now + relativedelta(months=+1)) # 2026-02-28 09:19:00print(now + relativedelta(years=+1, months=-3)) # 2027-10-30 09:19:00print(now + relativedelta(weekday=0)) # 加到下一个星期一(0=Monday)# 两个日期的相对差(精确到年月日)d1 = datetime(2025, 12, 25)d2 = datetime(2026, 1, 30)print(relativedelta(d2, d1)) # relativedelta(months=+1, days=+5)# 替换特定字段print(now + relativedelta(day=1)) # 本月1号:2026-01-01 09:19:00print(now + relativedelta(day=31)) # 自动调整到月末:2026-01-31 09:19:00
3. rrule:生成重复日期序列(日历规则,iCalendar 标准)
from dateutil.rrule import rrule, DAILY, WEEKLY, MONTHLY, YEARLY, FRfrom datetime import datetimestart = datetime(2026, 1, 1)# 每周五开会(每周一次,周五)weekly_fridays = list(rrule(WEEKLY, count=10, byweekday=FR, dtstart=start))print(weekly_fridays[:3]) # [2026-01-02, 2026-01-09, 2026-01-16, ...]# 每月1号和15号monthly = list(rrule(MONTHLY, count=6, bymonthday=(1,15), dtstart=start))print(monthly[:3])# 每年8月13日,如果是周五aug13_friday = list(rrule(YEARLY, count=5, bymonth=8, bymonthday=13, byweekday=FR, dtstart=start))print(aug13_friday)# 每3天一次,共10次every_3days = list(rrule(DAILY, interval=3, count=10, dtstart=start))
4. tz:时区处理(比 pytz 更轻量)
from dateutil.tz import tzlocal, tzutc, gettz# 当前本地时区local_tz = tzlocal()print(local_tz) # Asia/Taipei 或 America/New_York 等# UTCutc = tzutc()now_utc = datetime.now(utc)print(now_utc)# 指定城市时区ny_tz = gettz("America/New_York")print(datetime.now(ny_tz))# 转换时区dt_local = datetime.now(local_tz)dt_utc = dt_local.astimezone(tzutc())print(dt_utc)
关键点总结:
你觉得dateutil在你的项目中能解决哪些问题?欢迎评论分享经验。
Pandas 3.0 内存优化后,能打得过 Polars 和 DuckDB 吗?