python内核 7688_Python期货量化交易基础教程(10)

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

>>>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值