大師兄的Python學(xué)習(xí)筆記(十): 多進程和多線程
大師兄的Python學(xué)習(xí)筆記(十二): 常用高級函數(shù)
一、基礎(chǔ)概念
1. 關(guān)于Python中的時間模塊
- Python中有很多時間相關(guān)的模塊,其中比較常用的包括time包、datetime包、 calendar包、pytz包、dateutil包等。
- 本篇只介紹基礎(chǔ)包,還有很多好用的模塊可以根據(jù)功能需求在github中搜索。
2. 時間戳(timestamp)
- 時間戳是指格林威治時間自1970年1月1日(00:00:00 GMT)至當(dāng)前時間的總秒數(shù)。
- 時間戳具有唯一性,可以唯一地標識某一刻的時間。
- 32位系統(tǒng)中,時間戳的長度為32位,UNIX和Windows只支持到2038年。
>>>import time
>>>time.time() # 獲取當(dāng)前時間戳,距離1971年1月1日(00:00:00 GMT)的秒數(shù)
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 時區(qū) tm_zone 時區(qū)名稱的縮寫 N/A 偏離 tm_gmtoff 以秒為單位的UTC以東偏離
二、time包
- 提供了時間的訪問和轉(zhuǎn)換功能。
- 屬于Python的標準庫。
1)time.time()
- 獲取當(dāng)前時間的時間戳浮點數(shù)。
>>>import time >>>time.time() 1579695503.73545362)time.localtime(time)
- 轉(zhuǎn)換為本地時間。
- time的默認值是當(dāng)前時間。
>>>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的默認值是當(dāng)前時間。
>>>import time >>>time.asctime(time.localtime()) 'Tue Feb 4 17:59:38 2020'4)time.strftime(format,time)
- 獲取格式化的時間。
- 格式化符號:
符號 含義 %y 兩位數(shù)的年份表示(00-99) %Y 四位數(shù)的年份表示(000-9999) %m 月份(01-12) %d 月內(nèi)中的一天(0-31) %H 24小時制小時數(shù)(0-23) %I 12小時制小時數(shù)(01-12) %M 分鐘數(shù)(00=59) %S 秒(00-59) %a 本地簡化星期名稱 %A 本地完整星期名稱 %b 本地簡化的月份名稱 %B 本地完整的月份名稱 %c 本地相應(yīng)的日期表示和時間表示 %j 年內(nèi)的一天(001-366) %p 本地A.M.或P.M.的等價符 %U 一年中的星期數(shù)(00-53)星期天為星期的開始 %w 星期(0-6),星期天為星期的開始 %W 一年中的星期數(shù)(00-53)星期一為星期的開始 %x 本地相應(yīng)的日期表示 %X 本地相應(yīng)的時間表示 %Z 當(dāng)前時區(qū)的名稱 %% %號本身 >>>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()
- 返回當(dāng)前的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)
- 返回當(dāng)?shù)氐臅r間,相當(dāng)于asctime(localtime(secs))。
- time的默認值是當(dāng)前時間。
>>>import time >>>time.ctime() 'Thu Feb 6 18:12:01 2020'7)time.gmtime(time)
- 將時間戳轉(zhuǎn)換為格林威治時間,并返回 struct_time元祖。
- time的默認值是當(dāng)前時間。
>>>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)
- 將時間戳轉(zhuǎn)換為當(dāng)?shù)貢r間,并返回 struct_time元祖。
- time的默認值是當(dāng)前時間。
>>>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元祖轉(zhuǎn)換為時間戳。
>>>import time >>>time.mktime(time.localtime()) 1580984332.010)time.sleep(<time>)
- 讓線程等候<time>秒。
>>>import time >>>print(time.localtime()[-4]) >>>time.sleep(5) >>>print(time.localtime()[-4]) 30 3511)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屬性
- 當(dāng)?shù)貢r區(qū),即距離格林威治的偏移秒數(shù)。
>>>import time >>>time.timezone -2880013)time.tzname屬性
- 一個包含時區(qū)名稱和夏令時本地區(qū)名稱的元祖。
>>>import time >>>time.tzname ('中國標準時間', '中國夏令時')
三、datetime包
- datetime包重新封裝了time包,增加了更多的接口。
- datetime包在python標準庫中。
- datetime模塊包含的類和屬性:
| 類和屬性 | 功能 |
|---|---|
| date | 日期對象 |
| time | 時間對象 |
| datetime | 日期時間對象 |
| datetime_CAPI | 日期對象的C語言接口 |
| timedelta | 時間間隔 |
| tzinfo | 時區(qū)信息對象 |
| 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 142)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()
- 返回當(dāng)前日期對象。
>>>from datetime import date >>>today = date.today() >>>print(today) 2020-02-076)date.fromtimestamp(timestamp)
- 根據(jù)時間戳timestamp返回date對象。
>>>from datetime import date >>>import time >>>day = date.fromtimestamp(time.time()) >>>print(day) 2020-02-077)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 148)date.timetuple()
- 返回date對應(yīng)的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()) 410)date.isoweekday()
- 返回date是星期幾(從1開始)。
>>>from datetime import date >>>today = date.today() >>>print(today.isoweekday()) 511)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 None2)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)
- 創(chuàng)建一個新的time對象,并用新的屬性替換。
- 不影響原對象。
>>>from datetime import time >>>t1 = time(8,20,30,200) >>>t2 = t1.replace(10,10,20,100) >>>print(t2) 10:10:20.0001006)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的內(nèi)容相同。
>>>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類的結(jié)合體。
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 None2)datetime.today()
- 返回當(dāng)前本地時間datetime對象。
>>>from datetime import datetime >>>datetime.today() datetime.datetime(2020, 2, 8, 17, 21, 44, 571213)3)datetime.now(tz)
- 可以接受時區(qū)參數(shù),如果參數(shù)不存在則與today()相同。
>>>from datetime import datetime,timezone,timedelta >>>tz_utc_8 = timezone(timedelta(hours=8)) # 設(shè)置與UTC的8小時時差 >>>print(datetime.now(tz=tz_utc_8)) 2020-02-08 17:28:41.004420+08:004)datetime.utcnow()
- 返回UTC時間的datetime對象。(格林威治時間)
>>>from datetime import datetime >>>print(datetime.utcnow()) 2020-02-08 09:30:59.4234195)datetime.fromtimestamp(timestamp, tz)
- 根據(jù)時間戳創(chuàng)建datetime對象。
- tz為時區(qū)信息。
>>>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對象轉(zhuǎn)換為指定格式的字符串。
>>>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)
- 將日期時間字符串轉(zhuǎn)換為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.00020011)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() 73746314)datetime.weekday()
- 返回datetime對象是星期幾。
- 從0開始。
>>>from datetime import datetime >>>dt = datetime.now() >>>dt.weekday() 515)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:002)timedelta.min
- 返回負數(shù)最大時間差。
>>>from datetime import timedelta >>>timedelta.min datetime.timedelta(days=-999999999)3)timedelta.max
- 返回正數(shù)最大時間差。
>>>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類
- 是關(guān)于時區(qū)信息的類。
- 是一個抽象類,不能直接被實例化。
1)使用時區(qū)
>>>from datetime import * >>>class beijing(tzinfo): # 創(chuàng)建北京時區(qū) >>> # 北京時間 >>> 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包
- 日歷相關(guān)的模塊。
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 302)firstweekday()
- 返回每周的起始日期。
- 默認為0,星期一。
>>>import calendar >>>calendar.firstweekday() 03)isleap(year)
- 判斷year是不是閏年。
>>>import calendar >>>calendar.isleap(2020) True4)leapdays(year1,year2)
- 判斷兩年之間的閏年總數(shù)。
>>>import calendar >>>calendar.leapdays(1960,2020) 155)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 316)monthcalendar(year,month)
- 返回月歷的數(shù)字矩陣。
>>>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)
- 相當(dāng)于
print(calendar.calendar())。9)prmonth(year,month,w=2,l=1)
- 相當(dāng)于
print(calendar.calendar())。10)setfirstweekday(weekday)
- 設(shè)置每周的起始日期。
>>>import calendar >>>calendar.setfirstweekday(5) >>>calendar.firstweekday() 511)timegm(tupletime)
- 接受一個時間元祖,返回時間戳。
>>>import calendar,time >>>calendar.timegm(time.gmtime(time.time())) 158116566712)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/ 北京圖靈學(xué)院
- 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學(xué)習(xí)手冊》Mark Lutz
- 《Python編程 從入門到實踐》Eric Matthes
本文作者:大師兄(superkmi)