背景
关于时间的处理,python处理时间要多注意时间格式的类型。
准备工作
关于时间处理,python最常用的是datetime, time , calendar 3个包,其中datetime中又有5个类。
整体来说,datetime包熟练基本满足大部分时间处理场景了。
datetime中5个类:
- date类: 表示日期的类
- time类: 表示时间的类
- datetime类: 表示时间日期的类
- timedelta类: 表示两个datetime对象的差值;
- tzinfo类: 表示时区的相关信息
代码实例
一、import datetime :
datetime包主要提供表示和处理日期和时间的类, 主要用于创建和输出日期与信息的各种不同方式、时间增量的比较和计算.
datetime库定义了2个常量和5个类, 2个常量分别是MINYEAR=1和MAXYEAR=9999,5个类如上说明。
日常使用,基本熟练datetime包能满足90%以上需求;
1. date类: date类有三个对象:year、month、day, 返回格式为year-month-day.
1.1 基础操作
from datetime import date
today(): # 使用今天的日期构造对象
date.today() # 获取当前日期
datetime.date.today() # 获取当前日期
datetime.date.today().year # 获取当前年
datetime.date.today().month # 获取当前月
datetime.date.today().day # 获取当前日
# 或者用__getattribute__(...)方法获得上述值:
datetime.date.today().__getattribute__('year')
datetime.date.today().__getattribute__('month')
datetime.date.today().__getattribute__('day')
1.2 时间戳、结构 构造对象
fromtimestamp(): # 使用时间戳构造对象
date.fromtimestamp(123456789)
fromordinal(): # 使用日期序数构造对象
datetime.date.fromordinal() # 整数序数,代表从公元1年1月1日开始的序数,序数每增加1代表增加1天,返回最终计算出的日期
datetime.date.toordinal(date(1992,1,21)) # 参数是日期对象,fromtimestamp的逆过程,返回值为fromtimestamp(n)中的日期序数n
1.3 日期比较、计算 返回 T/F
a = datetime.date(2022,1,1)
b = datetime.date(2022,1,21)
print(a.__eq__(b)) # 等于 a == b
print(a.__ge__(b)) # 大于等于 a>=b
print(a.__gt__(b)) # 大于 a>b
print(a.__le__(b)) # 小于等于 a<=b
print(a.__lt__(b)) # 小于 a<b
print(a.__ne__(b)) # 不等于 a<>b
# 两个日期差距 同datediff 日期差值计算另一个方法即:datetime.timedelta类;
print(a.__sub__(b))
print(a.__rsub__(b))
#输出:
10 days, 0:00:00
-10 days, 0:00:00
1.4 返回周几
# 返回是周几
date(2022,1,1).weekday() # 周五 从0开始计
date(2022,1,1).isoweekday() # 周六 从1开始计
1.5 格式化、字符转换
# 格式化输出日期
a.isocalendar()/datetime.date.isocalendar(a) # 返回: 公历日期, year年份,week number周数,weekday星期数
a.isoformat() /datetime.date.isoformat(a) # 返回: 符合ISO 8601标准 (YYYY-MM-DD) 的日期字符串
# 时间和字符串转换 字符转换在时间维度下都是这个写法 strftime/strptime
datetime.date.strftime(时间to字符串)
datetime.date.strptime(字符串to时间)
a.strftime("%Y-%m-%d")
a.strftime("%Y-%m-%d")
a.isoformat()
a.replace(1992,1,21) # 传入参数为year,month,day,返回对应的新日期。
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
2. time类: 基本同date类
2.1 基础操作
from datetime import time
time类由hour小时、minute分钟、second秒、microsecond毫秒和tzinfo五部分组成
import datetime
datetime.time(12,30,59,21)
datetime.time(12,30)
2.2 时间比较 返回T/F
基本同datetime包一致;
# 时间大小比较
相关方法包括:__eq__(...), __ge__(...), __gt__(...), __le__(...), __lt__(...), __ne__(...)
与date类一致 ;
a = datetime.date(2022,1,1)
b = datetime.date(2022,1,21)
print(a.__eq__(b)) # 等于 a == b
print(a.__ge__(b)) # 大于等于 a>=b
print(a.__gt__(b)) # 大于 a>b
print(a.__le__(b)) # 小于等于 a<=b
print(a.__lt__(b)) # 小于 a<b
print(a.__ne__(b)) # 不等于 a<>b
2.3 格式化、字符转换
基本同datetime包一致;
# 时间to字符串
from datetime import time
a = time(12,20,59,899)
a.strftime('%H:%M:%S') == a.__format__('%H:%M:%S')
# 格式化输出
a = datetime.time(12,20,59,899)
a.isoformat() # 返回标准时间格式:HH:MM:SS.mmmmmm+zz:zz
2.4 时区操作
# 返回timezone的偏移量 比较少用
from datetime import datetime
time.utcoffset()
naive = datetime.now()
naive.tzinfo
naive.utcoffset()
# 返回timezone的名称。
datetime.tzname()
3. datetime类:
datetime类是date类和time类的合体 ,包含前两个类的全部参数, 相当于date类+time类.
除date类和time类的相同操作外,还有以下特性:
datetime.now() # 获取当前时间,使用当前日期和时间构造对象,无参数,返回当前的日期和时间。
datetime.utcnow() # 获取当前时间,使用当前日期和时间构造对象,无参数,返回当前的UTC(时间标准时间)日期和时间。
d = date(2021,1,21)
t = time(8,24,24)
datetime.combine(date,time) # 使用date和time构造对象,传入参数为1个date对象和1个time对象,返回计算出的日期。
datetime.astimezone(datetime.now()) # 返回日期中加入时区概念;
date(2021,1,21) # 传入年月日
time(8,24,24) # 传入时分秒
4. timedelta类:
用来计算二个datetime对象时间差值,等同于sql的datediff ,以及date类的__sub__,__rsub__方法(同1.3)
4.1 时间计算
import datetime
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
import datetime
day = datetime.datetime.now()
ddelay = datetime.timedelta(days=1)
wdelay = datetime.timedelta(weeks = 5)
ydelay = datetime.timedelta(weeks = 56)
print(day)
print(day - ddelay) # 一天前的时间
print(day + ddelay) # 一天后的时间
print(day - wdelay) # 5 周前
print(day + wdelay) # 5 周后
print(day - ydelay) # 一年前
print(day + ydelay) # 一年后
#输出:
2020-11-04 15:11:37.241980
2020-11-03 15:11:37.241980
2020-11-05 15:11:37.241980
2020-09-30 15:11:37.241980
2020-12-09 15:11:37.241980
2019-10-09 15:11:37.241980
2021-12-01 15:11:37.241980
二、import calendar
calendar主要用于日历获取、闰年判断等;
import calendar
calendar.month(2020, 11) # 获取某月日历:calendar.month
calendar.leapdays(2016,2019) # 返回在Y1,Y2两年之间(计头不计尾)的闰年总数。
calendar.isleap(2008) # 判断是否闰年
calendar.calendar(2022,30,1,1,1) # 打印某年日历 没啥用
calendar.monthrange(2022, 1) # 返回月份第一天的星期以及天数
(5, 30)
#(5, 30)解释:
#5 表示 2014 年 11 月份的第一天是周六
#30 表示 2014 年 11 月份总共有 30 天
calendar.weekday(2022,1,21) # 返回某天是周几 从0开始
三、import time
主要用于获取当前时间, 字符串日期转换等,和datetime的time类基本一致;
import time
time.time() # 时间戳
time.mktime(time.localtime()) # 时间戳
time.struct_time(time.localtime()) # 时间元组:struct_time
time.localtime(time.time()) # 时间元组:struct_time
#输出:
time.struct_time(tm_year=2020, tm_mon=11, tm_mday=4, tm_hour=11, tm_min=25, tm_sec=46, tm_wday=2, tm_yday=309, tm_isdst=0)
time.asctime() # 获取格式化时间 as ctime 'Tue Jan 18 15:38:57 2022'
time.strftime() # 时间/字符串 转换
time.strptime() # 字符串转时间
time.localtime()
time.strptime("2022-01-21","%Y-%m-%d")
time.strftime("%Y-%m-%d",db)
time.strftime("%Y+%m+%d")
结束语
时间插曲到此结束,基本熟练能满足90以上的时间处理需求,希望对大家有帮助。