首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Pendulum:让Python日期时间操作更轻松

操作日期时间是每个Python程序员都绕不开的话题。Python内置的datetime模块虽说功能齐全,但用起来总觉得不够顺手。要写个时区转换得绕好几道弯,算个日期差还得小心翼翼防止踩坑。今天跟大家介绍个好东西 -Pendulum库,它是datetime的超集,API设计特别人性化,用起来贼舒服。

安装配置

1pip install pendulum

装好就能用,简单吧?记得先import:

1import pendulum

创建时间对象

不像datetime那样要记一大堆参数位置,Pendulum创建时间对象超级简单:

1# 获取当前时间

2now = pendulum.now()

3print(now) # 2024-10-29T15:30:25.123456+08:00

5# 创建指定时间

6dt = pendulum.datetime(2024, 10, 1)

7print(dt) # 2024-10-01T00:00:00+08:00

9# 解析时间字符串

10dt = pendulum.parse('2024-10-01 15:30:00')

11print(dt) # 2024-10-01T15:30:00+08:00

小贴士:

Pendulum默认就会处理时区信息,不用额外操心

parse()方法支持各种常见的时间格式,不用写烦人的format字符串

创建的时间对象都是不可变的,避免了意外修改的问题

时间计算

日期计算是最容易把人搞晕的,看看Pendulum有多优雅:

1dt = pendulum.now()

3# 加减运算

4dt.add(days=1) # 加一天

5dt.subtract(weeks=2) # 减两周

6dt.add(years=1, months=2) # 加1年2个月

8# 显示人性化的时间差

9diff = dt.diff(dt.add(days=3))

10print(diff.in_words()) # '3天后'

12# 日期区间

13period = dt.range('days', dt.add(days=3))

14for d in period:

15 print(d) # 每天的日期

时区处理

时区转换在Pendulum里简直就是玩儿:

1# 创建带时区的时间

2dt = pendulum.now('America/New_York')

5# 转换时区

6tokyo = dt.in_timezone('Asia/Tokyo')

7print(tokyo) # 自动转换为东京时间

9# 时区列表

10zones = pendulum.timezones

11print(zones) # 所有可用时区

小贴士:

in_timezone()方法会自动处理夏令时

时区名称用标准的IANA时区名,别用GMT/UTC偏移

时区转换会保持时间点不变,只改变显示方式

格式化输出

输出格式化也是超级简单:

1dt = pendulum.now()

3# 常用格式

4print(dt.to_date_string()) # 2024-10-29

5print(dt.to_time_string()) # 15:30:25

6print(dt.to_datetime_string()) # 2024-10-29 15:30:25

8# 自定义格式

9print(dt.format('YYYY年MM月DD日')) # 2024年10月29日

11# 本地化

12print(dt.format('dddd', locale='zh')) # 星期二

小贴士:

format()方法支持各种简单好记的格式化占位符

locale参数支持多语言输出,再也不用自己转换星期几了

用了这么久Python,还是第一次见到处理时间这么爽的库。它把datetime、pytz、dateutil这些库的功能都整合在一起,API设计得特别统一。虽说依赖包会大点,但只要项目里有时间处理的需求,我都会毫不犹豫地用它。

代码仓库:## 高级特性玩法

真要说Pendulum厉害的地方,那就得看看这些骚操作:

1# 日期测试

2dt = pendulum.datetime(2024, 10, 29)

3print(dt.is_tuesday()) # True

4print(dt.is_weekend()) # False

5print(dt.is_future()) # True

6print(dt.is_leap_year()) # True

好家伙,直接一个方法就知道是不是周二,多直观。跟写if dt.weekday() == 1比起来不知道高到哪里去了。

日期区间骚操作

1# 创建一个时间区间

2dt1 = pendulum.datetime(2024, 1, 1)

3dt2 = pendulum.datetime(2024, 12, 31)

4period = pendulum.period(dt1, dt2)

6# 遍历每个月

7for dt in period.range('months'):

8 print(dt.format('YYYY-MM'))

10# 统计区间信息

11print(period.years) # 0

12print(period.months) # 11

13print(period.days) # 365

14print(period.in_days()) # 365

小贴士:

range()方法支持years、months、days、hours等单位

区间可以用来检查某个日期是否在范围内

in_days()这种方法直接给你总天数,不用自己算

相对时间处理

1# 获取特定时间点

2dt = pendulum.now()

3print(dt.start_of('day')) # 当天0点

4print(dt.end_of('month')) # 当月最后一秒

5print(dt.next(pendulum.MONDAY)) # 下个周一

6print(dt.previous(pendulum.FRIDAY)) # 上个周五

8# 相对时间描述

9past = dt.subtract(hours=2)

10print(past.diff_for_humans()) # '2小时前'

12future = dt.add(days=1)

13print(future.diff_for_humans()) # '1天后'

实用小技巧

处理时间戳转换:

1# 时间戳互转

2timestamp = pendulum.now().timestamp()

3dt = pendulum.from_timestamp(timestamp)

5# Unix时间戳(秒级)

6unix_ts = pendulum.now().int_timestamp

获取一段时期:

1dt = pendulum.now()

3# 获取本周日期

4week_start = dt.start_of('week')

5week_dates = week_start.range('days', week_start.end_of('week'))

7# 获取本月所有周一

8dt = dt.start_of('month')

9mondays = dt.end_of('month').every(pendulum.MONDAY)

小贴士:

timestamp默认是浮点数(微秒级),用int_timestamp获取整数(秒级)

用range和every可以轻松获取一段时间内的特定日期

start_of和end_of支持year、month、week、day等单位

Pendulum其实还有不少好玩的功能,像duration(时间段)、testing(时间测试)之类的。不过最常用的也就这些了。真要啥功能查文档就完事了。反正有了这玩意,写时间处理的代码再也不怕了。

平时写代码处理时间的时候,datetime老让我头大。自从用上了Pendulum,那感觉就像换了个人生。API设计得太合理了,上手特别快,代码看着也特别清爽。以后要是有朋友问我Python怎么处理时间,我第一个就推荐这个。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/Osk8xxIi5woU1Nj8fBxFjOqA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券