大师兄的Python学习笔记(十): 多进程和多线程
大师兄的Python学习笔记(十二): 常用高级函数
一、基础概念
1. 关于Python中的时间模块
- Python中有很多时间相关的模块,其中比较常用的包括time包、datetime包、 calendar包、pytz包、dateutil包等。
- 本篇只介绍基础包,还有很多好用的模块可以根据功能需求在github中搜索。
2. 时间戳(timestamp)
- 时间戳是指格林威治时间自1970年1月1日(00:00:00 GMT)至当前时间的总秒数。
- 时间戳具有唯一性,可以唯一地标识某一刻的时间。
- 32位系统中,时间戳的长度为32位,UNIX和Windows只支持到2038年。
>>>import time
>>>time.time() # 获取当前时间戳,距离1971年1月1日(00:00:00 GMT)的秒数
1579695503.7354536
3. struct_time元组
- 用于处理时间的元组,包含了时间的基本信息。
- 可以通过索引和属性名访问值。
- 值包括:
索引 含义 属性 值 0 年 tm_year (例如,1993) 1 月 tm_mon range [1, 12] 2 日 tm_mday range [1, 31] 3 小时 tm_hour range [0, 23] 4 分 tm_min range [0, 59] 5 秒 tm_sec range [0, 61] 6 一周的第几日 tm_wday range [0, 6] ,周一为 0 7 一年的第几日 tm_yday range [1, 366] 8 是否夏令时 tm_isdst 0, 1 或 -1 N/A 时区 tm_zone 时区名称的缩写 N/A 偏离 tm_gmtoff 以秒为单位的UTC以东偏离
二、time包
- 提供了时间的访问和转换功能。
- 属于Python的标准库。
1)time.time()
- 获取当前时间的时间戳浮点数。
>>>import time >>>time.time() 1579695503.7354536
2)time.localtime(time)
- 转换为本地时间。
- time的默认值是当前时间。
>>>import time >>>time.localtime() time.struct_time(tm_year=2020, tm_mon=2, tm_mday=4, tm_hour=17, tm_min=55, tm_sec=22, tm_wday=1, tm_yday=35, tm_isdst=0)
3)time.asctime(time)
- 获取默认格式的格式化时间。
- time的默认值是当前时间。
>>>import time >>>time.asctime(time.localtime()) 'Tue Feb 4 17:59:38 2020'
4)time.strftime(format,time)
- 获取格式化的时间。
- 格式化符号:
符号 含义 %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 当前时区的名称 %% %号本身 >>>import time >>>time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) '2020-02-05 18:59:00' >>>time.strftime("%a %b %d %H:%M:%S %Y",time.localtime()) 'Wed Feb 05 19:01:13 2020'
5)time.perf_counter()
- 返回当前的CPU时间戳。
- 通常用来计算程序耗时。
>>>import time >>>t0 = time.perf_counter() >>>for i in range(10000): >>> i+= 1 >>>t1 = time.perf_counter() >>>tz = str(t1-t0) >>>print("耗时{t}毫秒".format(t=tz)) 耗时0.0007448000001204491毫秒
6)time.ctime(time)
- 返回当地的时间,相当于asctime(localtime(secs))。
- time的默认值是当前时间。
>>>import time >>>time.ctime() 'Thu Feb 6 18:12:01 2020'
7)time.gmtime(time)
- 将时间戳转换为格林威治时间,并返回 struct_time元祖。
- time的默认值是当前时间。
>>>import time >>>time.gmtime(324234324) time.struct_time(tm_year=1980, tm_mon=4, tm_mday=10, tm_hour=17, tm_min=5, tm_sec=24, tm_wday=3, tm_yday=101, tm_isdst=0)
8)time.localtime(time)
- 将时间戳转换为当地时间,并返回 struct_time元祖。
- time的默认值是当前时间。
>>>import time >>>time.localtime(324234324) time.struct_time(tm_year=1980, tm_mon=4, tm_mday=11, tm_hour=1, tm_min=5, tm_sec=24, tm_wday=4, tm_yday=102, tm_isdst=0)
9)time.mktime(tupletime)
- 将struct_time元祖转换为时间戳。
>>>import time >>>time.mktime(time.localtime()) 1580984332.0
10)time.sleep(<time>)
- 让线程等候<time>秒。
>>>import time >>>print(time.localtime()[-4]) >>>time.sleep(5) >>>print(time.localtime()[-4]) 30 35
11)time.strptime(str,fmt)
- 将字符串str解析为struct_time元祖。
- fmt为字符串的时间格式。
>>>import time >>>time.strptime("2020-2-6 16:00:00","%Y-%m-%d %H:%M:%S") time.struct_time(tm_year=2020, tm_mon=2, tm_mday=6, tm_hour=16, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=37, tm_isdst=-1)
12)time.timezone属性
- 当地时区,即距离格林威治的偏移秒数。
>>>import time >>>time.timezone -28800
13)time.tzname属性
- 一个包含时区名称和夏令时本地区名称的元祖。
>>>import time >>>time.tzname ('中国标准时间', '中国夏令时')
三、datetime包
- datetime包重新封装了time包,增加了更多的接口。
- datetime包在python标准库中。
- datetime模块包含的类和属性:
类和属性 | 功能 |
---|---|
date | 日期对象 |
time | 时间对象 |
datetime | 日期时间对象 |
datetime_CAPI | 日期对象的C语言接口 |
timedelta | 时间间隔 |
tzinfo | 时区信息对象 |
MAXYEAR | 最大年份(9999) |
MINYEAR | 最小年份(1) |
3.1 date类
1)date(year,month,day)
- 实例化date类。
>>>from datetime import date >>>day = date(2020,2,14) >>>print(day) >>>print(day.year,day.month,day.day) 2020-02-14 2020 2 14
2)date.max
- 最大日期
>>>from datetime import date >>>date.max datetime.date(9999, 12, 31)
3)date.min
- 最小日期
>>>from datetime import date >>>date.min datetime.date(1, 1, 1)
4)date.resolution
- date类最小的对象,天。
>>>from datetime import date >>>date.resolution datetime.timedelta(days=1)
5)date.today()
- 返回当前日期对象。
>>>from datetime import date >>>today = date.today() >>>print(today) 2020-02-07
6)date.fromtimestamp(timestamp)
- 根据时间戳timestamp返回date对象。
>>>from datetime import date >>>import time >>>day = date.fromtimestamp(time.time()) >>>print(day) 2020-02-07
7)date.replace(year,month,day)
- 替换原属性并生成新的对象。
- 不影响原对象。
>>>from datetime import date >>>day1 = date(2020,2,14) >>>day2 = day1.replace(2020,3,14) >>>print(day2) >>>print(day2.year,day2.month,day2.day) 2020-03-14 2020 3 14
8)date.timetuple()
- 返回date对应的time.struct_time对象。
>>>from datetime import date >>>today = date.today() >>>print(today.timetuple()) time.struct_time(tm_year=2020, tm_mon=2, tm_mday=7, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=38, tm_isdst=-1)
9)date.weekday()
- 返回date是星期几(从0开始)。
>>>from datetime import date >>>today = date.today() >>>print(today.weekday()) 4
10)date.isoweekday()
- 返回date是星期几(从1开始)。
>>>from datetime import date >>>today = date.today() >>>print(today.isoweekday()) 5
11)date.isocalendar()
- 返回年、一年中的第几周和一周中的第几天的元祖。
>>>from datetime import date >>>today = date.today() >>>print(today.isocalendar()) (2020, 6, 5)
12)date.isoformat()
- 返回日期的标准格式字符串。
>>>from datetime import date >>>today = date.today() >>>print(today.isoformat()) 2020-02-07
3.2 time类
1)time(hour,minute,second,microsecond,tzinfo)
- 实例化time类。
>>>from datetime import time >>>t = time(8,20,30,200) >>>print(t) >>>print(t.hour,t.minute,t.second,t.microsecond,t.tzinfo) 08:20:30.000200 8 20 30 200 None
2)time.max
- 最大时间。
>>>from datetime import time >>>time.max datetime.time(23, 59, 59, 999999)
3)time.min
- 最小时间。
>>>from datetime import time >>>time.min datetime.time(0,0)
4)time.resolution
- 最小的时间单位。
>>>from datetime import time >>>time.resolution datetime.timedelta(microseconds=1)
5)time.replace(hour, minute, second, microsecond, tzinfo)
- 创建一个新的time对象,并用新的属性替换。
- 不影响原对象。
>>>from datetime import time >>>t1 = time(8,20,30,200) >>>t2 = t1.replace(10,10,20,100) >>>print(t2) 10:10:20.000100
6)time.isoformat()
- 返回标准的时间字符串。
>>>from datetime import time >>>t = time(8,20,30,200) >>>t.isoformat() '08:20:30.000200'
7)time.strftime(time,fmt)
- 接受一个datetime.time对象和格式,返回字符串。
- fmt与2.4的内容相同。
>>>from datetime import time >>>t = time(8,20,30,200) >>>print(time.strftime(t,"%Y-%m-%d %H:%M:%S")) >>>print(time.strftime(t,"%a %b %d %H:%M:%S %Y")) 1900-01-01 08:20:30 Mon Jan 01 08:20:30 1900
3.3 datetime类
- datetime类是date类和time类的结合体。
1)datetime(year,month,day,hour,minute,second,microsecond,tzinfo)
- 实例化datetime类。
>>>from datetime import datetime >>>dt = datetime(2020,2,14,8,20,30,200) >>>print(dt) >>>print(dt.year,dt.month,dt.day,dt.hour,dt.minute,dt.second,dt.microsecond,dt.tzinfo) 2020-02-14 08:20:30.000200 2020 2 14 8 20 30 200 None
2)datetime.today()
- 返回当前本地时间datetime对象。
>>>from datetime import datetime >>>datetime.today() datetime.datetime(2020, 2, 8, 17, 21, 44, 571213)
3)datetime.now(tz)
- 可以接受时区参数,如果参数不存在则与today()相同。
>>>from datetime import datetime,timezone,timedelta >>>tz_utc_8 = timezone(timedelta(hours=8)) # 设置与UTC的8小时时差 >>>print(datetime.now(tz=tz_utc_8)) 2020-02-08 17:28:41.004420+08:00
4)datetime.utcnow()
- 返回UTC时间的datetime对象。(格林威治时间)
>>>from datetime import datetime >>>print(datetime.utcnow()) 2020-02-08 09:30:59.423419
5)datetime.fromtimestamp(timestamp, tz)
- 根据时间戳创建datetime对象。
- tz为时区信息。
>>>from datetime import datetime >>>import time >>>datetime.fromtimestamp(time.time()) datetime.datetime(2020, 2, 8, 17, 33, 9, 517400)
6)datetime.isoformat(sep=’T’)
- 返回标准格式的日期时间字符串。
- sep是分割符。
>>>from datetime import datetime >>>dt = datetime.now() >>>dt.isoformat() '2020-02-08T17:35:04.790249'
7)datetime.ctime()
- 返回一个日期时间字符串。
>>>from datetime import datetime >>>dt = datetime.now() >>>dt.ctime() 'Sat Feb 8 17:36:52 2020'
8)datetime.strftime(fmt)
- 将datetime对象转换为指定格式的字符串。
>>>from datetime import datetime >>>dt = datetime.now() >>>fmt = "%Y-%m-%d %H:%M:%S" >>>dt.strftime(fmt) '2020-02-08 17:47:44'
9)datetime.strptime(date_string,format)
- 将日期时间字符串转换为datetime对象。
>>>from datetime import datetime >>>fmt = "%Y-%m-%d %H:%M:%S" >>>datetime.strptime("2020-02-08 17:40:00",fmt) datetime.datetime(2020, 2, 8, 17, 40)
10)datetime.combine(date,time)
- 将date对象和time对象合并成为一个新的datetime对象。
>>>from datetime import date,time,datetime >>>today = day.today() >>>t = time(8,20,30,200) >>>dt = datetime.combine(today,t) >>>print(dt) 2020-02-08 08:20:30.000200
11)datetime. timetuple()
- 返回datetime对象的struct_time元组。
>>>from datetime import datetime >>>dt= datetime.now() >>>dt. timetuple() time.struct_time(tm_year=2020, tm_mon=2, tm_mday=8, tm_hour=17, tm_min=51, tm_sec=58, tm_wday=5, tm_yday=39, tm_isdst=-1)
12)datetime. utctimetuple()
- 返回datetime对象的utc时间struct_time元组。
>>>from datetime import datetime,timezone,timedelta >>>tz_utc_8 = timezone(timedelta(hours=8)) >>>dt = datetime.now(tz=tz_utc_8) >>>dt. utctimetuple () time.struct_time(tm_year=2020, tm_mon=2, tm_mday=8, tm_hour=9, tm_min=58, tm_sec=7, tm_wday=5, tm_yday=39, tm_isdst=0)
13)datetime.toordinal()
- 计算datetime是从0001-01-01开始算起的第几天。
>>>from datetime import datetime >>>dt = datetime.now() >>>dt.toordinal() 737463
14)datetime.weekday()
- 返回datetime对象是星期几。
- 从0开始。
>>>from datetime import datetime >>>dt = datetime.now() >>>dt.weekday() 5
15)datetime.isocalendar()
- 返回datetime对象的年份,一年的第几周和一周的第几天。
- 返回的是一个元组。
>>>from datetime import datetime >>>dt = datetime.now() >>>dt.isocalendar() (2020, 6, 6)
3.4 timedelta类
- 表示两个时间的差值。
1)timedelta(days,seconds,microseconds,milliseconds,minutes,hours,weeks)
- 实例化timedelta类。
>>>from datetime import timedelta >>>delta = timedelta(days=1,minutes=5) # 时间差为1天零5分钟 >>>print(delta) 1 day, 0:05:00
2)timedelta.min
- 返回负数最大时间差。
>>>from datetime import timedelta >>>timedelta.min datetime.timedelta(days=-999999999)
3)timedelta.max
- 返回正数最大时间差。
>>>from datetime import timedelta >>>timedelta.max datetime.timedelta(days=999999999, seconds=86399, microseconds=999999)
4)timedelta.resolution
- 返回两个时间的最小时间差。
>>>from datetime import timedelta >>>timedelta.resolution datetime.timedelta(microseconds=1)
5)利用timedelta计算时间
- 可以很方便的利用timedelta对datetime对象进行计算。
>>>from datetime import * >>>today = datetime.now() >>>delta = timedelta(days=20,minutes=5,hours=10) >>>day = today + delta # 获得delta时间后的datetime类 >>>print(day) 2020-02-29 04:28:21.189760
3.5 tzinfo类
- 是关于时区信息的类。
- 是一个抽象类,不能直接被实例化。
1)使用时区
>>>from datetime import * >>>class beijing(tzinfo): # 创建北京时区 >>> # 北京时间 >>> def __init__(self,offset=8): >>> self._offset = offset >>> def utcoffset(self,dt): >>> return timedelta(hours=self._offset) >>> def tzname(self,dt): >>> return "beijing" >>> def dst(self,dt): >>> return timedelta(hours=self._offset) >>>beijing_time_now = datetime.now(beijing()) # 北京时间 >>>utc_time_now = datetime.now(beijing(-8)) # 格林威治时间 >>>print(beijing_time_now,beijing_time_now.tzinfo.tzname(beijing),beijing_time_now.tzinfo.utcoffset(beijing)) >>>print(utc_time_now) >>>print(beijing_time_now == utc_time_now) 2020-02-08 19:11:40.114615+08:00 beijing 8:00:00 2020-02-08 03:07:29.020073-08:00 True
四、calendar包
- 日历相关的模块。
1)calendar(year)
- 返回year的年历多行字符串。
>>>import calendar >>>print(calendar.calendar(2020)) 2020 January February March Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 5 1 2 1 6 7 8 9 10 11 12 3 4 5 6 7 8 9 2 3 4 5 6 7 8 13 14 15 16 17 18 19 10 11 12 13 14 15 16 9 10 11 12 13 14 15 20 21 22 23 24 25 26 17 18 19 20 21 22 23 16 17 18 19 20 21 22 27 28 29 30 31 24 25 26 27 28 29 23 24 25 26 27 28 29 30 31 April May June Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 5 1 2 3 1 2 3 4 5 6 7 6 7 8 9 10 11 12 4 5 6 7 8 9 10 8 9 10 11 12 13 14 13 14 15 16 17 18 19 11 12 13 14 15 16 17 15 16 17 18 19 20 21 20 21 22 23 24 25 26 18 19 20 21 22 23 24 22 23 24 25 26 27 28 27 28 29 30 25 26 27 28 29 30 31 29 30 July August September Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 5 1 2 1 2 3 4 5 6 6 7 8 9 10 11 12 3 4 5 6 7 8 9 7 8 9 10 11 12 13 13 14 15 16 17 18 19 10 11 12 13 14 15 16 14 15 16 17 18 19 20 20 21 22 23 24 25 26 17 18 19 20 21 22 23 21 22 23 24 25 26 27 27 28 29 30 31 24 25 26 27 28 29 30 28 29 30 31 October November December Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 1 1 2 3 4 5 6 5 6 7 8 9 10 11 2 3 4 5 6 7 8 7 8 9 10 11 12 13 12 13 14 15 16 17 18 9 10 11 12 13 14 15 14 15 16 17 18 19 20 19 20 21 22 23 24 25 16 17 18 19 20 21 22 21 22 23 24 25 26 27 26 27 28 29 30 31 23 24 25 26 27 28 29 28 29 30 31 30
2)firstweekday()
- 返回每周的起始日期。
- 默认为0,星期一。
>>>import calendar >>>calendar.firstweekday() 0
3)isleap(year)
- 判断year是不是闰年。
>>>import calendar >>>calendar.isleap(2020) True
4)leapdays(year1,year2)
- 判断两年之间的闰年总数。
>>>import calendar >>>calendar.leapdays(1960,2020) 15
5)month(year,month,w=2,l=1)
- 返回year年的month月历。
>>>import calendar >>>print(calendar.month(2020,3)) March 2020 Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
6)monthcalendar(year,month)
- 返回月历的数字矩阵。
>>>import calendar >>>monthcalendar(2020,3) [[0, 0, 0, 0, 0, 0, 1], [2, 3, 4, 5, 6, 7, 8], [9, 10, 11, 12, 13, 14, 15], [16, 17, 18, 19, 20, 21, 22], [23, 24, 25, 26, 27, 28, 29], [30, 31, 0, 0, 0, 0, 0]]
7)monthrange(year,month)
- 返回year年month年的第一天是星期几。
- 返回year年month年一共有多少天。
>>>import calendar >>>calendar.monthrange(2020,3) (6, 31)
8)prcal(year,w=2,l=1,c=6)
- 相当于
print(calendar.calendar())
。9)prmonth(year,month,w=2,l=1)
- 相当于
print(calendar.calendar())
。10)setfirstweekday(weekday)
- 设置每周的起始日期。
>>>import calendar >>>calendar.setfirstweekday(5) >>>calendar.firstweekday() 5
11)timegm(tupletime)
- 接受一个时间元祖,返回时间戳。
>>>import calendar,time >>>calendar.timegm(time.gmtime(time.time())) 1581165667
12)calendar.weekday(year,month,day)
- 返回特定日期是星期几。
>>>import calendar >>>calendar.weekday(2020,4,24) 4
参考资料
- https://blog.csdn.net/u010138758/article/details/80152151 J-Ombudsman
- https://www.cnblogs.com/zhuluqing/p/8832205.html moisiet
- https://www.runoob.com 菜鸟教程
- http://www.tulingxueyuan.com/ 北京图灵学院
- http://www.imooc.com/article/19184?block_id=tuijian_wz#child_5_1 两点水
- https://blog.csdn.net/weixin_44213550/article/details/91346411 python老菜鸟
- https://realpython.com/python-string-formatting/ Dan Bader
- https://www.liaoxuefeng.com/ 廖雪峰
- https://blog.csdn.net/Gnewocean/article/details/85319590 新海说
- https://www.cnblogs.com/Nicholas0707/p/9021672.html Nicholas
- 《Python学习手册》Mark Lutz
- 《Python编程 从入门到实践》Eric Matthes
本文作者:大师兄(superkmi)