10、时间日期处理:
先了解两个概念:UTC time,世界协调时,又称世界标准时间,与UTC time对应的是各个时区的local time,东N区的时间比UTC时间早N个小时,因此UTC time + N小时,即为东N区的本地时间;而西N区时间比UTC时间晚N个小时,即 UTC time - N小时,即为西N区的本地时间;中国在东8区,因此比UTC时间早8小时,可以以UTC+8表示。
timestamp(时间戳),也称为Unix时间或POSIX时间,它是一种时间表示方式,表示从UTC时间1970年1月1日0时0分0秒开始到现在所经过的毫秒数,其值为float类型。 但有些编程语言的相关方法返回的是秒数,比如Python返回的是秒数。时间戳是个差值,其值与时区无关。
10.1、time模块:
time模块主要在程序中用sleep()函数暂停,及用来访问时间格式的属性或对不同时间格式相互转换,其主要方法如下:
sleep(n):让程序在此处暂停n秒,例如暂停5.999999秒,精确到毫秒:
import time
time.sleep(5.999999)
clock():返回当前进程所消耗的处理器运行时间秒数(包括sleep时间);该方法Python3.3改成了process_time(),且在Python 3.8会被移除,新函数不包括sleep时间,process_time_ns()返回秒数的小数部分,精确到纳秒,例如:
>>> import time
>>> time.time();time.sleep(3);time.time();time.clock();time.process_time();time.process_time_ns()
1610932112.7313514
1610932115.731523
223.312804451
0.1092007
109200700
>>>
altzone:属性访问,返回UTC时间与本地时间的时间差,以秒为单位(西区该值为正,东区该值为负),例如:
>>> time.altzone
-32400
>>>
time():返回本地时间戳(自1970-1-1 0:00:00 至今的秒数),例如:
>>> time.time()
1610855939.2073827
>>>
localtime(secs):将时间戳secs转换为本地时间struct_time对象,如果无参数,默认以time()返回值作为参数,例如:
>>> time.localtime()
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=17, tm_hour=12, tm_min=5, tm_sec=32, tm_wday=6, tm_yday=17, tm_isdst=0)
>>> time.localtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
>>> time.localtime(500)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=8, tm_sec=20, tm_wday=3, tm_yday=1, tm_isdst=0)
>>>
从返回值可知,返回的是东8区,即北京时间。
gmtime(secs):将时间戳secs转换为UTC时间struct_time对象,如果无参数,默认以time()返回值作为参数,例如:
>>> time.gmtime()
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=17, tm_hour=4, tm_min=14, tm_sec=16, tm_wday=6, tm_yday=17, tm_isdst=0)
>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
>>> time.gmtime(500)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=8, tm_sec=20, tm_wday=3, tm_yday=1, tm_isdst=0)
>>>
从返回值可知,返回的是UTC时间。
asctime(t):将一个时间tuple或struct_time形式的时间转换为一个24个字符的时间字符串,格式为:'Sun Jan 17 12:19:19 2021'。如果参数t未提供,则取本地localtime()的返回值作为参数。例如:
>>> time.asctime()
'Sun Jan 17 12:19:19 2021'
>>> time.asctime(time.localtime(0))
'Thu Jan 1 08:00:00 1970'
>>> time.asctime(time.gmtime(0))
'Thu Jan 1 00:00:00 1970'
>>>
ctime(secs):将一个时间戳表示的时间转换为一个表示本地时间的字符串,如果参数secs没有提供或值为None,则取本地time()返回值,ctime(secs)等价于asctime(localtime(secs)),例如:
>>> time.ctime()
'Sun Jan 17 12:25:39 2021'
>>> time.ctime(0)
'Thu Jan 1 08:00:00 1970'
>>>
strptime(string: str, format: str=...):将时间字符串转换为struct_time时间对象,例如:
>>> time.strptime('Thu Jan 1 08:00:00 1970')
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=-1)
>>> time.strptime('Thu Jan 1 08:00:00 1970', '%a %b%d%H:%M:%S %Y')
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=-1)
>>> time.strptime('1970-1-1 8:0:0','%Y-%m-%d%H:%M:%S')
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=-1)
>>>
时间字符串格式和格式化参数格式要保持一致,不然无法匹配,常用的格式有:'%Y-%m-%d %H:%M:%S'、'%Y/%m/%d %H:%M:%S'、'%Y%m%d%H%M%S'。
strftime(format: str, t: Union[_TimeTuple, struct_time]=...):将一个时间tuple或struct_time形式的时间转换为时间字符串,默认转换本地当前时间例如:
>>> time.strftime('%Y-%m-%d%H:%M:%S',time.localtime())
'2021-01-17 12:48:06'
>>> time.strftime('%Y/%m/%d%H:%M:%S',time.localtime())
'2021/01/17 12:48:49'
>>> time.strftime('%Y-%m-%d%H:%M:%S')
'2021-01-17 12:50:43'
>>>
mktime(struct_time):将一个时间tuple或struct_time形式的时间转换为时间戳,例如:
>>> time.localtime();time.mktime(time.localtime());time.time()
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=17, tm_hour=12, tm_min=58, tm_sec=7, tm_wday=6, tm_yday=17, tm_isdst=0)
1610859487.0
1610859487.4981003
>>>
struct_time时间格式是一个类,可用“.”操作符获取其时间属性,其内部也会返回一个元组序列,因此也可以用索引值获取时间属性,但用属性名称获取时间属性更直观:属性名索引值释义
tm_year0年
tm_mon1月,取值范围为[1, 12]
tm_mday2日,取值范围为[1-31]
tm_hour3时, 取值范围为[0-23]
tm_min4分,取值范围为[0, 59]
tm_sec5秒,取值范围为[0, 59]
tm_wday6一个星期中的第几天,取值范围为[0-6],0表示星期一
tm_yday7一年中的第几天,取值范围为[1, 366]
tm_isdst8是否为夏令时,可取值为:0 , 1 或 -1
例如:
>>> t=time.localtime()
>>> print(t.tm_year,t.tm_wday,t.tm_isdst)
2021 6 0
>>> print(t[0],t[6],t[8])
2021 6 0
>>>
字符串格式的时间,例如'2021-01-17 12:50:43',不能直接和时间戳相互转换,需要先转换成中间类型struct_time。
10.2、datetime模块:
datetime模块提供了处理日期和时间的类, 其功能包含了大部分time模块的功能,比time模块更为直观。datetime模块有两个常量:MINYEAR表示年份的最小值,值为1;MAXYEAR表示年份的最大值,值为9999。
10.2.1、date类:
date类主要用来创建date对象,属性max是date对象所能表示的最大日期:9999-12-31,min是date对象所能表示的最小日期:0001-01-01,resolution是date对象表示的日期的最小单位:1 day, 0:00:00。
例如:
>>> from datetime import date
>>> date.max
datetime.date(9999, 12, 31)
>>> date.min
datetime.date(1, 1, 1)
>>> date.resolution
datetime.timedelta(days=1)
>>>
today()返回一个表示当前本地日期的date对象,例如:
>>> date.today()
datetime.date(2021, 1, 17)
>>>
fromtimestamp(timestamp),把时间戳转换为date对象,例如:
>>> import time
>>> date.fromtimestamp(time.time())
datetime.date(2021, 1, 17)
>>>
date对象的属性和方法:属性/方法释义
year年
month月
day日
replace(year[, month[, day]])生成并返回一个新的日期对象,原日期对象不变
timetuple()返回日期对应的time.struct_time对象
toordinal()返回日期是是自 0001-01-01 开始的第多少天
weekday()返回日期是星期几,[0, 6],0表示星期一
isoweekday()返回日期是星期几,[1, 7], 1表示星期一
isocalendar()返回一个元组,格式为:(year, weekday, isoweekday)
isoformat()返回‘YYYY-MM-DD’格式的日期字符串
strftime(format)返回指定格式的日期字符串,与time模块的strftime(format, struct_time)功能相同
例如:
>>> dt=date.today()
>>> dt.year;dt.month;dt.day
2021
1
17
>>> dt.replace(2020)
datetime.date(2020, 1, 17)
>>> dt.replace(2020,3)
datetime.date(2020, 3, 17)
>>> dt.replace(2020,3,20)
datetime.date(2020, 3, 20)
>>> dt.timetuple()
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=17, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=17, tm_isdst=-1)
>>> dt.toordinal()
737807
>>> dt.weekday()
6
>>> dt.isoweekday()
7
>>> dt.isocalendar()
(2021, 2, 7)
>>> dt.isoformat()
'2021-01-17'
>>> dt.strftime('%Y/%m/%d')
'2021/01/17'
>>>
10.2.2、time类:
time(hour: int=...,minute: int=..., second: int=..., microsecond: int=..., tzinfo: Optional[_tzinfo]=..., *, fold: int=...)
time类的参数均是可选的,无参数返回的是00:00:00。参数hour是小时,minute是分,second是秒,microsecond是微妙,tzinfo为时区。
time类主要用来定义时间段,比如,中国期货市场分白盘和夜盘,则可用time定义如下:
from datetime import time
day_start = time(8, 45) #上午开盘
day_end = time(15, 15) #下午收盘
night_start = time(20, 45) #夜盘开盘
night_end = time(2,30) #凌晨收盘
10.2.3、datetime类:
datetime包含了日期和时间的接口。
today():返回一个表示当前本地日期时间的datetime对象,例如:
>>> from datetime import datetime
>>> datetime.today()
datetime.datetime(2021, 1, 18, 9, 48, 59, 82131)
>>> print(datetime.today())
2021-01-18 09:49:10.612790
>>>
now(tz):返回指定时区日期时间的datetime对象,如果不指定tz参数则结果同today()
utcnow():返回当前utc日期时间的datetime对象,例如:
>>> from datetime import datetime,timezone
>>> print(datetime.today());print(datetime.now());print(datetime.now(timezone.ut
c));print(datetime.utcnow())
2021-01-18 10:05:21.227306
2021-01-18 10:05:21.227306
2021-01-18 02:05:21.227306+00:00
2021-01-18 02:05:21.227306
>>>
fromtimestamp(timestamp[, tz]):把时间戳转换为datetime对象,默认为本地时区。
utcfromtimestamp(timestamp):把时间戳转换为datetime对象,时区为UTC。例如:
>>> print(datetime.fromtimestamp(time.time()));print(datetime.utcfromtimestamp(t
ime.time()));print(datetime.fromtimestamp(time.time(),timezone.utc))
2021-01-18 10:17:58.807637
2021-01-18 02:17:58.807637
2021-01-18 02:17:58.808637+00:00
>>>
combine(date, time):把指定的date和time对象整合成一个datetime对象,例如:
>>> datetime.combine(date(2021, 1, 18), time(10,22,50))
datetime.datetime(2021, 1, 18, 10, 22, 50)
>>>
strptime(t_str, format):将时间字符串转换为datetime对象,时间和格式化的格式要匹配,例如:
>>> datetime.strptime('2021-01-18 10:25:30', '%Y-%m-%d%H:%M:%S')
datetime.datetime(2021, 1, 18, 10, 25, 30)
>>>
datetime对象的属性和方法如下:属性/方法释义
year、month、day、hour、minute、second、microsecond年、月、日、时、分、秒、微秒
tzinfo时区
date()获取datetime对象对应的date对象
time()获取datetime对象对应的time对象, tzinfo 为None
timetz()获取datetime对象对应的time对象,tzinfo与datetime对象的tzinfo相同
replace()替换日期时间的一项或多项,生成并返回一个新的datetime对象,如果所有参数都没有指定,则返回一个与原datetime对象相同的对象
timetuple()返回datetime对象对应的tuple(不包括tzinfo)
utctimetuple()返回datetime对象对应的utc时间的tuple(不包括tzinfo)
toordinal()返回日期是是自 0001-01-01 开始的第多少天
weekday()返回日期是星期几,[0, 6],0表示星期一
isocalendar()返回一个元组,格式为:(year, weekday, isoweekday)
isoformat(sep)返回‘YYYY-MM-DD’格式的日期字符串,sep是日期和时间的分隔符。
ctime()返回'Mon Jan 18 10:48:03 2021'格式的时间
timestamp()返回时间戳
strftime(format)返回指定格式的时间字符串
例如:
>>> dt=datetime.today()
>>> dt.year;dt.hour
2021
10
>>> dt.date()
datetime.date(2021, 1, 18)
>>> dt.time();dt.timetz()
datetime.time(10, 48, 3, 896883)
datetime.time(10, 48, 3, 896883)
>>> dt.replace(2022)
datetime.datetime(2022, 1, 18, 10, 48, 3, 896883)
>>> dt.timetuple()
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=18, tm_hour=10, tm_min=48, tm_s
ec=3, tm_wday=0, tm_yday=18, tm_isdst=-1)
>>> dt.weekday()
0
>>> dt.isocalendar()
(2021, 3, 1)
>>> dt.isoformat()
'2021-01-18T10:48:03.896883'
>>> dt.isoformat(sep=' ')
'2021-01-18 10:48:03.896883'
>>> dt.ctime()
'Mon Jan 18 10:48:03 2021'
>>> dt.timestamp()
1610938083.896883
>>> dt.strftime('%Y/%m/%d%H:%M:%S.%f')
'2021/01/18 10:48:03.896883'
>>>
字符串格式的时间,例如'2021-01-17 12:50:43',不能直接和时间戳相互转换,需要先转换成中间类型datetime。
日期可以做算术运算和比较的,时间也可以做比较,例如:
>>> from datetime import datetime,date,time
>>> dt=datetime.today();dt
datetime.datetime(2021, 1, 18, 11, 15, 33, 704246)
>>> print('相差天数:',dt.date()-date(2000,1,1))
相差天数: 7688 days, 0:00:00
>>> print(dt.date()>date(2000,1,1))
True
>>> dt.time()
datetime.time(11, 15, 33, 704246)
>>> print(dt.time()>time(8,45,30))
True
>>>
10.2.4、timedelta类:
timedelta类表示日期时间的差值,差值的单位可以是:天、小时、分钟、秒、毫秒、微秒、周。
timedelta(days: float=..., seconds: float=..., microseconds: float=..., milliseconds: float=..., minutes: float=..., hours: float=..., weeks: float=..., *, fold: int=...),类的参数都是可选的,默认日期时间差值都为0。
timedelta类属性min是天的最小值-999999999,max是天的最大值999999999,resolution是秒的最小单位:微秒,例如:
>>> from datetime import timedelta
>>> print(timedelta.min);print(timedelta.max);print(timedelta.resolution)
-999999999 days, 0:00:00
999999999 days, 23:59:59.999999
0:00:00.000001
>>> timedelta.min;timedelta.max;timedelta.resolution
datetime.timedelta(days=-999999999)
datetime.timedelta(days=999999999, seconds=86399, microseconds=999999)
datetime.timedelta(microseconds=1)
>>>
timedelta对象参与日期时间的计算如下:
>>> from datetime import datetime,timedelta
>>> dt=datetime.today()
>>> dt
datetime.datetime(2021, 1, 18, 12, 29, 30, 723029)
>>> dt + timedelta(1) # 1天后
datetime.datetime(2021, 1, 19, 12, 29, 30, 723029)
>>> dt + timedelta(-1) # 1天前
datetime.datetime(2021, 1, 17, 12, 29, 30, 723029)
>>> dt + timedelta(hours=1) # 1小时后
datetime.datetime(2021, 1, 18, 13, 29, 30, 723029)
>>> dt + timedelta(hours=-1) # 1小时前
datetime.datetime(2021, 1, 18, 11, 29, 30, 723029)
>>> dt + timedelta(days=1,hours=1) #1天1小时后
datetime.datetime(2021, 1, 19, 13, 29, 30, 723029)
>>>
timedelta对象的属性和方法如下:days:天,取值范围[-999999999, 999999999];
seconds:时分秒一共的秒数,取值范围秒[0, 86399],86400秒为1天;
microseconds:微秒,取值范围微秒 [0, 999999];
total_seconds():时间差中包含的总秒数。
例如:
>>> td=timedelta(days=2,seconds=30,microseconds=789,milliseconds=456,minutes=15,
hours=1,weeks=0)
>>> td.days;td.seconds;td.microseconds;td.total_seconds()
2
4530
456789
177330.456789
>>>