您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

python中时间处理标准库DateTime加强版库:pendulum

时间:2023-01-10 15:20:35  来源:今日头条  作者:helloworld攻城狮

DateTime的时区问题

Python/ target=_blank class=infotextkey>Python的datetime可以处理2种类型的时间,分别为offset-nAIve和offset-aware。前者是指没有包含时区信息的时间,后者是指包含时区信息的时间,只有同类型的时间才能进行减法运算和比较。

 

datetime模块的函数在默认情况下都只生成offset-naive类型的datetime对象,例如now()、utcnow()、fromtimestamp()、utcfromtimestamp()和strftime()。

其中now()和fromtimestamp()可以接受一个tzinfo对象来生成offset-aware类型的datetime对象,但是标准库并不提供任何已实现的tzinfo类,只能自己实现。

一旦生成了一个offset-aware类型的datetime对象,我们就能调用它的astimezone()方法,生成其他时区的时间(会根据时差来计算)。

而如果拿到的是offset-naive类型的datetime对象,也是可以调用它的replace()方法来替换tzinfo的,只不过这种替换不会根据时差来调整其他时间属性。

因此,如果拿到一个格林威治时间的offset-naive类型的datetime对象,直接调用replace(tzinfo=UTC())即可转换成offset-aware类型,然后再调用astimezone()生成其他时区的datetime对象。

不带时区datetime实例
普通的datetime都是不带时区信息

>>> from datetime import datetime
>>> datetime_now = datetime.now()
>>> 
>>> datetime_now
datetime.datetime(2023, 1, 10, 14, 29, 3, 6825)

带时区datetime实例

>>> import pytz
>>> datetime_now = datetime.now(tz=pytz.utc)
>>> datetime_now
datetime.datetime(2023, 1, 10, 6, 30, 18, 694175, tzinfo=<UTC>)

 

pendulum

pendulum是对datetime的高级封装,主要是用的是带时区的datetime

>>> import pendulum
>>> from datetime import datetime
>>> now = pendulum.now()
>>> now
DateTime(2023, 1, 10, 14, 32, 18, 906761, tzinfo=Timezone('Asia/Shanghai'))
>>> 
>>> isinstance(now, datetime)
True

 

创建DateTime实例

pendulum是简化时间操作的模块。
特别注意确保正确处理时区,并基于底层tzinfo实现。例如,所有比较均以UTC或所用日期时间的时区进行。pendulum默认创建带时区的datetime,但时区并不是当地时区,而是标准时区UTC时区。

创建

>>>dt = pendulum.datetime(2023, 1, 10)
>>>dt
DateTime(2023, 1, 10, 0, 0, 0, tzinfo=Timezone('UTC'))

如果没有指明时分秒,那么就是00:00:00,并且时区是UTC。此外它也可以是Timezone实例或一个简单的时区字值

local
local 和 datetime()很类似,但是会自动设置时区为本地时区

>>>dt = pendulum.local(2023,1,10)
>>>dt
DateTime(2023, 1, 10, 0, 0, 0, tzinfo=Timezone('Asia/Shanghai'))

now
now 和 local一样,也会自动设置时区为本地时区

>>>now = pendulum.now()
>>>now
DateTime(2023, 1, 10, 14, 43, 42, 782703, tzinfo=Timezone('Asia/Shanghai'))

tomorrow
获取明天的起始时间,零时零点。带时区

>>>tomm = pendulum.tomorrow()
>>>tomm
DateTime(2023, 1, 11, 0, 0, 0, tzinfo=Timezone('Asia/Shanghai'))

yesterday
获取昨天的起始时间,零时零点,带时区

>>>yes = pendulum.yesterday()
>>>yes
DateTime(2023, 1, 9, 0, 0, 0, tzinfo=Timezone('Asia/Shanghai'))

naive 不带时区实例
pendulum是强制使用时区的,使用它们是使用库的首选和推荐方式。但是如果你真的需要一个简单的DateTime对象,可以使用naive()

>>>>>>naive = pendulum.naive(2023, 1, 10, 14, 47, 23)
>>>naive
DateTime(2023, 1, 10, 14, 47, 23)

从字符串创建

form_format
form_format和原生的datetime.strptime()很类似,但使用自定义标记创建DateTime实例

>>> dt = pendulum.from_format('1975-05-21 22', 'YYYY-MM-DD HH')
>>> dt
DateTime(1975, 5, 21, 22, 0, 0, tzinfo=Timezone('UTC'))

同样可以接受一个时区

>>> dt = pendulum.from_format('1975-05-21 22', 'YYYY-MM-DD HH', tz='Asia/Shanghai')>>> 
>>> dt
DateTime(1975, 5, 21, 22, 0, 0, tzinfo=Timezone('Asia/Shanghai'))

form_timestamp
最后一个助手用于处理unix时间戳。from_timestamp()将创建一个与给定时间戳相等的DateTime实例,并设置时区或将其默认为UTC。

>>>dt = pendulum.from_timestamp(1673334526.330153)
>>>dt
DateTime(2023, 1, 10, 7, 8, 46, 330153, tzinfo=Timezone('UTC'))

parse
pendulum.parse() 可以将字符串转peewee对象,默认不设置本地时区,可通过tz手动添加时区。字符串格式支持:

  • RFC 3339 format
  • ISO 8601 formats
>>> dt = pendulum.parse('1975-05-21T22:00:00')
>>> print(dt)
'1975-05-21T22:00:00+00:00

pendulum 属性和方法

pendulum 对象有十分庞大的属性和方法

 

输出当前时刻的年月日时分秒

>>> dt.year
2023
>>> dt.month
1
>>> dt.day
10
>>> dt.hour
15
>>> dt.minute
21
>>> dt.second
15
>>> dt.microsecond
737073
>>>

输出当前时间是一年中的第几周,第几天,第几个月

>>> dt.day_of_week
2
>>> dt.day_of_year
10
>>> dt.week_of_year
2 
>>> dt.days_in_month
31

输出对象的时区相关时区名字时区类型本地时区或标准时区

>>> dt.timezone
Timezone('Asia/Shanghai')
>>> 
>>> dt.is_local()
True
>>> dt.is_utc()
False

date和time的属性

date通常是指年月日的时间
time通常是指时分秒的时间
pendulum属性中可以输出date和time

date time

>>>dt.now()
DateTime(2023, 1, 10, 15, 28, 37, 242587, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.now().time()
Time(15, 28, 42, 570116)
>>>dt.now().date()
Date(2023, 1, 10)
>>>print(dt.now().time())
15:29:29.355958
>>>type(dt.now().time())
<class 'pendulum.time.Time'>
  >>>type(dt.now().time())
<class 'pendulum.time.Time'>
  >>>print(dt.now().date())
2023-01-10

date,time都不是datetime类型的。所以在一些时间加减运算,比较等操作是date和time都不可以和pendulum直接运算。

字符串输出格式

date,time,datetime 相关字符串格式的输出

>>>dt = pendulum.now()
>>>dt.to_date_string()
'2023-01-10'
>>>dt.to_time_string()
'15:40:47'
>>>dt.to_datetime_string()
'2023-01-10 15:40:47'

自定义输出格式

>>>dt.format('dddd Do [of] MMMM YYYY HH:mm:ss A')
'Tuesday 10th of January 2023 15:40:47 PM'
>>>dt.strftime('%Y %I:%M:%S %p')
'2023 03:40:47 PM'

format 比 strftime 使用更加直观,而且支持更多参数

>>> dt.format('YYYY-MM-DD HH:mm:ss')
'2023-01-10 15:40:47'

可以使用的参数:

-

TOKEN

OUTPUT

YEAR

YYYY

2000, 2001, 2002 ... 2012, 2013

 

YY

00, 01, 02 ... 12, 13

 

Y

2000, 2001, 2002 ... 2012, 2013

QUARTER

Q

1 2 3 4

 

Qo

1st 2nd 3rd 4th

MONTH

MMMM

January, February, March ...

 

MMM

Jan, Feb, Mar ...

 

MM

01, 02, 03 ... 11, 12

 

M

1, 2, 3 ... 11, 12

 

Mo

1st 2nd ... 11th 12th

DAY OF YEAR

DDDD

001, 002, 003 ... 364, 365

 

DDD

1, 2, 3 ... 4, 5

DAY OF MONTH

DD

01, 02, 03 ... 30, 31

 

D

1, 2, 3 ... 30, 31

 

Do

1st, 2nd, 3rd ... 30th, 31st

DAY OF WEEK

dddd

Monday, Tuesday, Wednesday ...

 

ddd

Mon, Tue, Wed ...

 

dd

Mo, Tu, We ...

 

d

0, 1, 2 ... 6

DAYS OF ISO WEEK

E

1, 2, 3 ... 7

HOUR

HH

00, 01, 02 ... 23, 24

 

H

0, 1, 2 ... 23, 24

 

hh

01, 02, 03 ... 11, 12

 

h

1, 2, 3 ... 11, 12

MINUTE

mm

00, 01, 02 ... 58, 59

 

m

0, 1, 2 ... 58, 59

SECOND

ss

00, 01, 02 ... 58, 59

 

s

0, 1, 2 ... 58, 59

转义字符

要转义格式字符串中的字符,可以将字符括在方括号中。

>>>dt.format('[today] dddd')
'today Tuesday'

时间比较

pendulum的时间可以直接比较。但是只能限制在相同对象之间。如datetime和datetime之间可以比较,datetime和date无法比较,带时区对象和不带时区对象无法比较。

时间加减运算

有一些需要对时间操作的场景,比如定时4个小时执行一段代码,这是需要对时间加减运算。时间加减返回DateTime实例,不会造成时区变化。加减运算仅限于同一种类型的时间。

方法:

  1. add 加法
  2. subtract 减法

pendulum支持的加减的时间颗粒度:

  1. years
  2. months
  3. days
  4. hours
  5. minutes
  6. seconds

同时也支持多个参数

>>>dt = pendulum.now()
>>>dt.add(years=1)
DateTime(2024, 1, 10, 15, 50, 26, 300775, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.subtract (years=1)
DateTime(2022, 1, 10, 15, 50, 26, 300775, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.add(months=2)
DateTime(2023, 3, 10, 15, 50, 26, 300775, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.subtract(months=2)
DateTime(2022, 11, 10, 15, 50, 26, 300775, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.add(hours=1)
DateTime(2023, 1, 10, 16, 50, 26, 300775, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.subtract(hours=1)
DateTime(2023, 1, 10, 14, 50, 26, 300775, tzinfo=Timezone('Asia/Shanghai'))

pendulum常用方法

获取时区的方法

>>>pendulum.now().timezone.name
'Asia/Shanghai'

转换时区

>>>pendulum.now().in_timezone('UTC')
DateTime(2023, 1, 10, 7, 57, 33, 12087, tzinfo=Timezone('UTC'))

起始时间

pendulum提供了起始日期的获取方法

开始时间
获取一个时间的开始时间,可以为:year,month,day,week

>>>dt = pendulum.now()
>>>dt.start_of('year')
DateTime(2023, 1, 1, 0, 0, 0, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.start_of('month')
DateTime(2023, 1, 1, 0, 0, 0, tzinfo=Timezone('Asia/Shanghai'))
>>>>>>dt.start_of('day')
DateTime(2023, 1, 10, 0, 0, 0, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.start_of('week')
DateTime(2023, 1, 9, 0, 0, 0, tzinfo=Timezone('Asia/Shanghai'))

截止日期
获取一个时间的截止日期,可以为year,month,day,week

>>>dt.end_of('year')
DateTime(2023, 12, 31, 23, 59, 59, 999999, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.end_of('month')
DateTime(2023, 1, 31, 23, 59, 59, 999999, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.end_of('day')
DateTime(2023, 1, 10, 23, 59, 59, 999999, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.end_of('week')
DateTime(2023, 1, 15, 23, 59, 59, 999999, tzinfo=Timezone('Asia/Shanghai'))

修改时间

pendulum提供一些帮助,通过对旧实例修改,返回一个新的实例。
但是,除了显式设置时区外,这些帮助程序都不会更改实例的时区。具体而言,设置时间戳不会将相应的时区设置为UTC

>>> dt = pendulum.now()
>>> dt.set(year=1975, month=5, day=21).to_datetime_string()
'1975-05-21 15:59:29'

in_timezone() in_tz()可以将时间转化到设置的时区。

>>>dt = pendulum.now()
>>>dt
DateTime(2023, 1, 10, 16, 4, 50, 734603, tzinfo=Timezone('Asia/Shanghai'))
>>>dt.in_timezone('Europe/London')
DateTime(2023, 1, 10, 8, 4, 50, 734603, tzinfo=Timezone('Europe/London'))
>>>dt.in_timezone('UTC')
DateTime(2023, 1, 10, 8, 4, 50, 734603, tzinfo=Timezone('UTC'))

 

本文引自:
https://www.cnblogs.com/goldsunshine/p/15292216.html



Tags:python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
一篇文章教会你使用Python中三种简单的函数
所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。一、函数简介所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。二、函数定义...【详细内容】
2024-04-11  Search: python  点击:(2)  评论:(0)  加入收藏
一篇文章带你了解Python的分布式进程接口
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。一、前言在Thread和Process中,应当优...【详细内容】
2024-04-11  Search: python  点击:(2)  评论:(0)  加入收藏
Python 可视化:Plotly 库使用基础
当使用 Plotly 进行数据可视化时,我们可以通过以下示例展示多种绘图方法,每个示例都会有详细的注释和说明。1.创建折线图import plotly.graph_objects as go# 示例1: 创建简单...【详细内容】
2024-04-01  Search: python  点击:(8)  评论:(0)  加入收藏
Python 办公神器:教你使用 Python 批量制作 PPT
介绍本文将介绍如何使用openpyxl和pptx库来批量制作PPT奖状。本文假设你已经安装了python和这两个库。本文的场景是:一名基层人员,要给一次比赛活动获奖的500名选手制作奖状,并...【详细内容】
2024-03-26  Search: python  点击:(17)  评论:(0)  加入收藏
Python实现工厂模式、抽象工厂,单例模式
工厂模式是一种常见的设计模式,它可以帮助我们创建对象的过程更加灵活和可扩展。在Python中,我们可以使用函数和类来实现工厂模式。一、Python中实现工厂模式工厂模式是一种常...【详细内容】
2024-03-07  Search: python  点击:(33)  评论:(0)  加入收藏
不可不学的Python技巧:字典推导式使用全攻略
Python的字典推导式是一种优雅而强大的工具,用于创建字典(dict)。这种方法不仅代码更加简洁,而且执行效率高。无论你是Python新手还是有经验的开发者,掌握字典推导式都将是你技能...【详细内容】
2024-02-22  Search: python  点击:(34)  评论:(0)  加入收藏
如何进行Python代码的代码重构和优化?
Python是一种高级编程语言,它具有简洁、易于理解和易于维护的特点。然而,代码重构和优化对于保持代码质量和性能至关重要。什么是代码重构?代码重构是指在不改变代码外部行为的...【详细内容】
2024-02-22  Search: python  点击:(35)  评论:(0)  加入收藏
Python开发者必备的八个PyCharm插件
在编写代码的过程中,括号几乎无处不在,以至于有时我们会拼命辨别哪个闭合括号与哪个开头的括号相匹配。这款插件能帮助解决这个众所周知的问题。前言在PyCharm中浏览插件列表...【详细内容】
2024-01-26  Search: python  点击:(87)  评论:(0)  加入收藏
Python的Graphlib库,再也不用手敲图结构了
Python中的graphlib库是一个功能强大且易于使用的工具。graphlib提供了许多功能,可以帮助您创建、操作和分析图形对象。本文将介绍graphlib库的主要用法,并提供一些示例代码和...【详细内容】
2024-01-26  Search: python  点击:(88)  评论:(0)  加入收藏
大语言模型插件功能在携程的Python实践
作者简介成学,携程高级安全研发工程师,关注Python/Golang后端开发、大语言模型等领域。一、背景2023年初,科技圈最火爆的话题莫过于大语言模型了,它是一种全新的聊天机器人模型,...【详细内容】
2024-01-26  Search: python  点击:(74)  评论:(0)  加入收藏
▌简易百科推荐
一篇文章教会你使用Python中三种简单的函数
所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。一、函数简介所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。二、函数定义...【详细内容】
2024-04-11  Go语言进阶学习  微信公众号  Tags:Python   点击:(2)  评论:(0)  加入收藏
一篇文章带你了解Python的分布式进程接口
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。一、前言在Thread和Process中,应当优...【详细内容】
2024-04-11  Go语言进阶学习    Tags:Python   点击:(2)  评论:(0)  加入收藏
Python 可视化:Plotly 库使用基础
当使用 Plotly 进行数据可视化时,我们可以通过以下示例展示多种绘图方法,每个示例都会有详细的注释和说明。1.创建折线图import plotly.graph_objects as go# 示例1: 创建简单...【详细内容】
2024-04-01  Python技术    Tags:Python   点击:(8)  评论:(0)  加入收藏
Python 办公神器:教你使用 Python 批量制作 PPT
介绍本文将介绍如何使用openpyxl和pptx库来批量制作PPT奖状。本文假设你已经安装了python和这两个库。本文的场景是:一名基层人员,要给一次比赛活动获奖的500名选手制作奖状,并...【详细内容】
2024-03-26  Python技术  微信公众号  Tags:Python   点击:(17)  评论:(0)  加入收藏
Python实现工厂模式、抽象工厂,单例模式
工厂模式是一种常见的设计模式,它可以帮助我们创建对象的过程更加灵活和可扩展。在Python中,我们可以使用函数和类来实现工厂模式。一、Python中实现工厂模式工厂模式是一种常...【详细内容】
2024-03-07  Python都知道  微信公众号  Tags:Python   点击:(33)  评论:(0)  加入收藏
不可不学的Python技巧:字典推导式使用全攻略
Python的字典推导式是一种优雅而强大的工具,用于创建字典(dict)。这种方法不仅代码更加简洁,而且执行效率高。无论你是Python新手还是有经验的开发者,掌握字典推导式都将是你技能...【详细内容】
2024-02-22  子午Python  微信公众号  Tags:Python技巧   点击:(34)  评论:(0)  加入收藏
如何进行Python代码的代码重构和优化?
Python是一种高级编程语言,它具有简洁、易于理解和易于维护的特点。然而,代码重构和优化对于保持代码质量和性能至关重要。什么是代码重构?代码重构是指在不改变代码外部行为的...【详细内容】
2024-02-22  编程技术汇    Tags:Python代码   点击:(35)  评论:(0)  加入收藏
Python开发者必备的八个PyCharm插件
在编写代码的过程中,括号几乎无处不在,以至于有时我们会拼命辨别哪个闭合括号与哪个开头的括号相匹配。这款插件能帮助解决这个众所周知的问题。前言在PyCharm中浏览插件列表...【详细内容】
2024-01-26  Python学研大本营  微信公众号  Tags:PyCharm插件   点击:(87)  评论:(0)  加入收藏
Python的Graphlib库,再也不用手敲图结构了
Python中的graphlib库是一个功能强大且易于使用的工具。graphlib提供了许多功能,可以帮助您创建、操作和分析图形对象。本文将介绍graphlib库的主要用法,并提供一些示例代码和...【详细内容】
2024-01-26  科学随想录  微信公众号  Tags:Graphlib库   点击:(88)  评论:(0)  加入收藏
Python分布式爬虫打造搜索引擎
简单分布式爬虫结构主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理,爬虫只需要从控制节点那里接收任务,并把新生成任务提交给控制节点就可以了,在这个...【详细内容】
2024-01-25  大雷家吃饭    Tags:Python   点击:(59)  评论:(0)  加入收藏
站内最新
站内热门
站内头条