当前位置:首页>python>Python-dateutil:为什么这个日期扩展库下载量破210亿

Python-dateutil:为什么这个日期扩展库下载量破210亿

  • 2026-08-27 00:56:06
Python-dateutil:为什么这个日期扩展库下载量破210亿
<摘要>
好库分享

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)

关键点总结:

  • 优势:灵活解析、相对计算、时区支持
  • 与datetime:互补而非替代
  • 适用:脚本自动化、数据处理
  • 不足:额外依赖

你觉得dateutil在你的项目中能解决哪些问题?欢迎评论分享经验。

往期回顾BREAK AWAY

Pandas 3.0 正式版来了!比你想象中更狠的两个改变

Pandas 3.0 内存优化后,能打得过 Polars 和 DuckDB 吗?

Pandas3.0用Rust重写后性能暴增5倍?
2025年终复盘:停更又复活,关于流量、AI与技术号的几句真心话
2025年最受欢迎的编程语言:热度背后的逻辑与趋势

最新文章

随机文章