python 常用日期处理-- datetime 模块的使用
仅以此篇记录一下个人常用的Python处理日期的库与函数,主要涉及的类库有Python自带的datetime,time和calendar,以及第三方的dateutil。说到日期处理基本上要覆盖的概念有date,time,datetime,timezone,calendar,时间的比较与差值,解析与格式化显示等。
在datetime模块中类之间的继承关系如下:
object
├──date
│└──datetime
├──time
├──timedelta
└──tzinfo
└──timezone
我们着重体验一下前面粗体显示的datetime,date,time,timedelta对象,timezone也不是不重要,有时候也可能只需要处理本地时间。
datetime,date,time实例的创建
可以使用它们各自的构造函数,提供必要的参数来创建相应的实例,下面是它们的构造函数
datetime: def__new__(cls,year,month=None,day=None,hour=0,minute=0,second=0, microsecond=0,tzinfo=None,*,fold=0) date: def__new__(cls,year,month=None,day=None) time: def__new__(cls,hour=0,minute=0,second=0,microsecond=0,tzinfo=None,*,fold=0)
比如
fromdatetimeimportdatetime,date,time,timedelta today=date(2019,4,24)#2019-04-24
获得当前日期或时间
date.today()#2019-04-24 datetime.now()#2019-04-2421:41:40.226300 datetime.today()#2019-04-2421:41:50.336293 datetime.today().date()#2019-04-24 datetime.today().time()#21:41:50.336303 datetime.now().date() datetime.now().time()
从语义上应该调用date.today()和datetime.now(),datetime.today()只是datetime继承自date的函数。
time没有today()或now()方法,所以只有通过datetime.now()来得到相应的time,datetime兼具date与time信息,所以总是可以经由datetime来获得相应的date和time。
解析字符串获得实例
date.fromisoformat('2019-04-24')#2019-04-24 datetime.fromisoformat('2019-04-24T13:12:23')#2019-04-2413:12:23 datetime.strptime('04/24/2019','%m/%d/%Y')#2019-04-2400:00:00 time.fromisoformat('12:12:24+06:00')#12:12:24+06:00
datetime,date和time都有fromisoformat()方法,就是要了解它们各自的ISO表示格式。能指定格式来解析字符串只有datetime有strptime()方法,因为有了datetime也就有了相应的date与time
date,datetime与time相应的ISO格式如下
- dateISOformat:YYYY-MM-DD
- datetimeISOformat:YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]
- timeISOformat:HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]
能自由解析字符串的就是datetime.strptime(str,fmt),Python借鉴了标准C的日期格式定义字符串,见strftime()andstrptime()Behavior.后面的strftime()函数也要用到相同的格式定义法。
注:strftime()和strptime()中的f和p分别对应着format和parse的首字母。
基于Timestamp来创建实例
Python本身没有Timestamp这么一个类型,这里的timestamp是一个浮点数表示的
ts=datetime.today().timestamp()#1556161777.38553 date.fromtimestamp(ts)#2019-04-24 datetime.fromtimestamp(ts)#2019-04-2422:09:37.385530
time没有fromtimestamp()方法
格式化输出
date,datetime和time都有isoformat()和strftime(fmt)函数,格式字符串请参考strftime()andstrptime()Behavior。
date.today().strftime('%a%b%d,%Y')#WedApr24,2019 datetime.today().isoformat()#2019-04-24T22:21:38.747318 datetime.today().time().strftime('%Y')#1900 date.today().strftime('%S')#00
上面是几个例子,注意在Python中像time没有年月日信息时格式化时想要输出年份会得到不期望的值,但不会象Java中那样报错。比如下面的Java代码
DateTimeFormatterformatter=DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate.now().format(formatter);//2019-04-24 LocalTime.now().format(formatter);//Exceptionjava.time.temporal.UnsupportedTemporalTypeException:Unsupportedfield:YearOfEra
由于LocalTime.now()没有年月日信息,所以无法格式化为yyyy-MM-dd。
时间,日期的比较与timedelta
- date,datetime,time都定义有__lt__,__le__,__ne__,__gt__,__ge__,__eq__函数,所以两个相同类型的实例之间是可以进行比较时间上的先后的。
- 其中的date,datetime还定义了__sub__和__rsub__函数,因此两个date或两个datetime实例进行相减会得到一个timedelta实例
- 另外,date,datetime也定义了__add__,__radd__函数,date或datetime可以加减一个timedelta来得到一个新的实例
下面看几个简单的示例
d1=datetime.today()#2019-04-2423:00:31.672769 delta=timedelta(days=2,weeks=1,seconds=-3)#8days,23:59:57 d2=d1+delta#2019-05-0323:00:28.672769 d3=d1-delta#2019-04-1523:00:34.672769 d2-d1#8days,23:59:57 d2>d1#True d1注意,不同类型间不能相减,比如用date减去一个datetime就不合法了。d1+delta,d1-delta和delta+d1都没问题,但是delta-d1就不行了。
timedelta表示了两个时间的差值,用它来推算另一个实例的时候不带有日历信息,如果想要在日历上推演就得借助于calendar。
不可忽略的time模块
前面讲到的是datetime模块中的time类型,Python还自带了time模块,由importtime引入。它提供了一些很实用的功能
- time包含了完整的如上的datetime信息,并不像datetime中的time不含年月日信息
- locatime(),strptime(),gmtime(),asctime(),mktime()用以构造time实例
- strftime()可用来格式化输出
- time.time()得到当前的Unix时间戳
- time.sleep(sec)用来暂停当前线程若干秒
关于calendar和dateutil的内容有后续
以上就是python日期处理的详细内容,更多关于python日期处理的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。