隨心所欲地用Python處理時間(1&2)
datetime模塊提供了用于處理日期和時間的類和對應(yīng)的方法,一般用于處理年、月、日、時、分、秒的統(tǒng)計(jì)和計(jì)算等需求。在支持日期時間數(shù)學(xué)運(yùn)算的同時,實(shí)現(xiàn)的關(guān)注點(diǎn)更著重于如何能夠更有效地解析其屬性用于格式化輸出和數(shù)據(jù)操作。學(xué)習(xí)該模塊,首先要有一個概念:日期和時間,要不然會混亂,這里進(jìn)行狹義的理解即可:日期是日期,時間是時間,日常生活中有時候并沒有很好的去區(qū)分。
日期:年月日,如 20210612
時間:時分秒,如 20:45:50
Python標(biāo)準(zhǔn)庫中包含日期(date)和時間(time)的數(shù)據(jù)類型,還有日歷方面的功能。要比較系統(tǒng)的學(xué)習(xí)該模塊,需要了解下面的兩個概念。
UTC(全球標(biāo)準(zhǔn)時間):是全球范圍內(nèi)計(jì)時的科學(xué)標(biāo)準(zhǔn),它基于精心維護(hù)的原子鐘,在全球范圍內(nèi)精確到微秒,由于英文(CUT)和法文(TUC)的縮寫不同,作為妥協(xié),簡稱UTC。作為全球最精確的時間系統(tǒng),天文學(xué)家、航海家、“太空跟蹤網(wǎng)”(DSN) 以及其他科學(xué)性學(xué)科都使用它,它的參考點(diǎn)是英國格林威治標(biāo)準(zhǔn)時間(GMT):地球本初子午線的午夜,也是 UTC 的午夜 (00:00:00.000000)。本地時間是根據(jù)地球上不同時區(qū)所處的位置調(diào)整 UTC 得來的,比如當(dāng)美國加州的太平洋時間為正午 12:00:00 時,UTC 為 20:00:00。
夏令時(DST):表示為了節(jié)約能源, 人為規(guī)定時間的意思。也叫夏時制,夏時令(Daylight Saving Time:DST),又稱"日光節(jié)約時制"和"夏令時間”,在這一制度實(shí)行期間所采用的統(tǒng)一時間稱為“夏令時間”。一般在天亮早的夏季人為將時間調(diào)快一小時,可以使人早起早睡,減少照明量,以充分利用光照資源,從而節(jié)約照明用電。各個采納夏時制的國家具體規(guī)定不同。全世界有近110個國家每年要實(shí)行夏令時。
感知型”和“簡單型”對象:日期和時間對象可以根據(jù)它們是否包含時區(qū)信息而分為“感知型”和“簡單型”兩類。充分掌握應(yīng)用性算法和政治性時間調(diào)整信息例如時區(qū)和夏令時的情況下,一個?感知型?對象就能相對于其他感知型對象來精確定位自身時間點(diǎn)。感知型對象是用來表示一個沒有解釋空間的固定時間點(diǎn)。簡單型對象沒有包含足夠多的信息來無歧義地相對于其他 date/time 對象來定位自身時間點(diǎn)。
時間戳:Unix時間戳是從1970年1月1日(UTC/GMT的午夜)開始所經(jīng)過的秒數(shù),不考慮閏秒。Unix時間戳(英文為Unix epoch, Unix time, POSIX time 或 Unix timestamp)
import?time?time.time()?1625483470.3409266
一、datetime模塊概
Python內(nèi)置的時間模塊datetime包含下面的模塊包含六個類和兩個常數(shù),提供了用于處理日期和時間的類和對應(yīng)的方法,一般用于處理年、月、日、時、分、秒的統(tǒng)計(jì)和計(jì)算等需求,且這些類型的對象都是不可變的。最常用的是datetime.datetime,有些人誤以為就一個模塊,其實(shí)是datetime模塊下的datetime類。
常量、類或方法名 | 注解 |
datetime.date | 一個理想化的簡單型日期,它假設(shè)當(dāng)今的公歷在過去和未來永遠(yuǎn)有效。屬性包含: year, month, day。 |
datetime.time | 一個獨(dú)立于任何特定日期的理想化時間,它假設(shè)每一天都恰好等于 24*60*60 秒。這里沒有“閏秒”的概念) 包含屬性:hour、minute、second、microsecond 、tzinfo。 |
datetime.datetime | 是日期和時間的結(jié)合,屬性包含year、month、day、hour、minute、second、?microsecond、?tzinfo.表示日期時間 |
datetime.timedelta | 表示兩個 date 對象或者 time 對象,或者 datetime 對象之間的時間間隔,精確到微秒。 |
datetime.tzinfo | 一個描述時區(qū)信息對象的抽象基類。用來給datetime和time類提供自定義的時間調(diào)整概念(例如處理時區(qū)和/或夏令時)。 |
datetime.timezone | 一個實(shí)現(xiàn)了tzinfo抽象基類的子類,用于表示相對于世界標(biāo)準(zhǔn)時間(UTC)的偏移量。 |
datetime.MINYEAR | 常量,表示年份允許的最小值為1 |
datetime.MAXYEAR | 常量,表示年份允許的最大值為9999 |
書接上回,接著寫
二、datetime.date類
1、date類介紹
作用:date類用來處理日期信息
語法:date類是datetime的內(nèi)嵌類,實(shí)例化語法:datetime.date(year,?month,?day)
參數(shù):year年份、month月份及day日期,所有參數(shù)都是必要的, 參數(shù)必須是在下面范圍內(nèi)的整數(shù)
MINYEAR?<=?year?<=?MAXYEAR
1?<=?month?<=?12
1?<=?day<=?給定年月對應(yīng)的天數(shù)
如果參數(shù)不在這些范圍內(nèi),則拋出 ValueError 異常。
import?datetimet?=?datetime.date(2019,8,26)print(type(t))print(t.day,t.month,t.year)?#?<class?'datetime.date'>26?8?2019
通過內(nèi)置函數(shù)dir,可以查看date類的所有方法和屬性
from?datetime?import?dateprint(dir(date))['ctime',?'day',?'fromisocalendar',?'fromisoformat',?'fromordinal',?'fromtimestamp',?'isocalendar',?'isoformat',?'isoweekday',?'max',?'min',?'month',?'replace',?'resolution',?'strftime',?'timetuple',?'today',?'toordinal',?'weekday',?'year']
?
2、類方法
date.today()
作用:返回當(dāng)前的本地日期,等價于date.fromtimestamp(time.time())。
from?datetime?import?date?date.today()datetime.date(2021,?7,?4)
date.fromtimestamp()
作用:返回對應(yīng)于POSIX時間戳的當(dāng)?shù)貢r間,例如 time.time()?返回的就是時間戳。這可能引發(fā) OverflowError,如果時間戳數(shù)值超出所在平臺 C localtime()?函數(shù)的支持范圍的話,并且會在 localtime()?出錯時引發(fā) OSError。通常該數(shù)值會被限制在 1970 年至 2038 年之間。請注意在時間戳概念包含閏秒的非 POSIX 系統(tǒng)上,閏秒會被 fromtimestamp()?所忽略。
在 3.3 版更改:?引發(fā) OverflowError 而不是 ValueError,如果時間戳數(shù)值超出所在平臺 C localtime()?函數(shù)的支持范圍的話,并會在 localtime()?出錯時引發(fā) OSError 而不是 ValueError。
用法:date.fromtimestamp(timestamp)
from?datetime?import?datedate.fromtimestamp(1339119900000/1e3).strftime('%Y-%m-%d?%H:%M')'2012-06-07?00:00'date.fromtimestamp(1339120800000/1e3).strftime('%Y-%m-%d?%H:%M')'2012-06-07?00:00'
注意: unix時間戳是從1970年1月1日(UTC/GMT的午夜)開始所經(jīng)過的秒數(shù),不考慮閏秒。
?
date.fromordinal()
作用:返回對應(yīng)于預(yù)期格列高利歷序號的日期,其中公元 1 年 1 月 1 晶的序號為 1。
用法:date.fromordinal(ordinal)
from?datetime?import?dated?=?date.fromordinal(730920)?#?730920th?day?after?1.?1.?0001ddatetime.date(2002,?3,?11)
?
date.fromisoformat()
作用:返回一個對應(yīng)于以?YYYY-MM-DD?格式給出的?date_string?的?date?對象
用法:date.fromisoformat(date_string)
from?datetime?import?datedate.fromisoformat('2019-12-04')datetime.date(2019,?12,?4)
這是 date.isoformat()?的逆操作。它只支持 YYYY-MM-DD 格式。更通用的要用strptime
d.isoformat()'2002-03-11'
date.fromisocalendar()
作用:返回指定 year, week 和 day 所對應(yīng) ISO 歷法日期的 date。這是函數(shù) date.isocalendar()?的逆操作。
用法:date.fromisocalendar(year,?week,?day)
今年的42周第三天是10月20號
date.fromisocalendar(2021,?42,?3)datetime.date(2021,?10,?20)
?
3、類屬性
date.min
最小的日期 date(MINYEAR, 1, 1)?。
from?datetime?import?datedate.mindatetime.date(1,?1,?1)
date.max
最大的日期 ,date(MAXYEAR, 12, 31)。
from datetime import datedate.maxdatetime.date(9999, 12, 31)
date.resolution
兩個日期對象的最小間隔,timedelta(days=1)。
from datetime import datedate.resolutiondatetime.timedelta(days=1)
date.year
在 MINYEAR 和 MAXYEAR 之間,包含邊界。
from datetime import dated = date.today()#生成一個date對象ddatetime.date(2021, 7, 5)d.year2021
date.month
1 至 12(含)
#接上述案例d.month7
date.day
返回1到指定年月的天數(shù)間的數(shù)字。
#接上述案例d.day5
?
3、實(shí)例方法
date.replace()
作用:返回一個具有同樣值的日期,除非通過任何關(guān)鍵字參數(shù)給出了某些形參的新值。
用法:date.replace(year=self.year,?month=self.month,?day=self.day)
from?datetime?import?dated = date(2002, 12, 31)d.replace(day=26)datetime.date(2002, 12, 26)
date.timetuple()
作用:返回一個 time.struct_time,即 time.localtime()?所返回的類型。hours, minutes 和 seconds 值均為 0,且 DST 旗標(biāo)值為 -1。
用法:date.timetuple(d)
d?=?date(2002,?12,?31)date.timetuple(d)time.struct_time(tm_year=2002, tm_mon=12, tm_mday=31,tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=365,tm_isdst=-1)
date.toordinal()
作用:返回日期的預(yù)期格列高利歷序號,其中公元 1 年 1 月 1 日的序號為 1。對于任意 date 對象 d,date.fromordinal(d.toordinal())?== d。
d = date(1, 1, 1)d.toordinal()1d = date(2002, 12, 31)d.toordinal()731215date.fromordinal(d.toordinal())datetime.date(2002, 12, 31)
?
date.weekday()
作用:返回一個整數(shù)代表星期幾,星期一為0,星期天為6。
date(2002,?12,?4).weekday()2
date.isoweekday()
作用:返回一個整數(shù)代表星期幾,星期一為1,星期天為7。
date(2002,?12,?4).isoweekday()3
date.isocalendar()
作用:返回一個由三部分組成的 named tuple 對象: year, week 和 weekday。
ISO 歷法是一種被廣泛使用的格列高利歷。ISO 年由 52 或 53 個完整星期構(gòu)成,每個星期開始于星期一結(jié)束于星期日。一個 ISO 年的第一個星期就是(格列高利)歷法的一年中第一個包含星期四的星期。這被稱為 1 號星期,這個星期四所在的 ISO 年與其所在的格列高利年相同。
例如,2004 年的第一天是星期四,因此 ISO 2004 年的第一個星期開始于 2003 年 12 月 29 日星期一,結(jié)束于 2004 年 1 月 4 日星期日.
from datetime import datedate(2003, 12, 29).isocalendar()(2004, 1, 1) # 舊版本datetime.IsoCalendarDate(year=2004,?week=1,?weekday=1)?#?新版本date(2004, 1, 4).isocalendar()datetime.IsoCalendarDate(year=2004,?week=1,?weekday=7)
在 3.9 版更改:?結(jié)果由元組改為 named tuple。
?
date.isoformat()
作用:返回一個以 ISO 8601 格式?YYYY-MM-DD?來表示日期的字符串
用法:date.isoformat(d)
from?datetime?import?datedate(2021,?10,?1).isoformat()'2021-10-01'
這是 date.fromisoformat()?的逆操作。
?
date.__str__()
作用:對于日期對象 d, str(d)?等價于 d.isoformat()?。
用法:date.__str__(d)
from datetime import datedate(2021, 10, 1).__str__()'2021-10-01'str(date(2021, 10, 1))'2021-10-01'
?
date.ctime()
作用:返回一個表示日期的字符串,在原生 C ctime()?函數(shù) (time.ctime()?會發(fā)起調(diào)用該函數(shù),但 date.ctime()?則不會) 遵循 C 標(biāo)準(zhǔn)的平臺上。
from datetime import datedate(2021,?10,?1).ctime()'Fri?Oct??1?00:00:00?2021'
d.ctime()?等效于 time.ctime(time.mktime(d.timetuple()))
d=date(2021, 10, 1)import timetime.ctime(time.mktime(d.timetuple()))'Fri?Oct??1?00:00:00?2021'
date.strftime()
作用:翻譯下就是 str from time,將給定格式的日期時間對象轉(zhuǎn)換為字符串。日期時間對象=>字符串,控制日期時間對象的輸出格式,date、datetime、time對象都支持strftime(format)?方法,可用來創(chuàng)建由一個顯式格式字符串所控制的表示時間的字符串。要獲取格式指令的完整列表,查看文末列表。
用法:date.strftime(format)
掌握了這個方法,隨心所以的轉(zhuǎn)換日期格式
import?datetimedt=datetime.date(2021, 10, 1)#創(chuàng)建一個日期對象dt.strftime("%Y-%m-%d")'2021-10-01'dt.strftime("%Y年%m月%d日")'2021年10月01日'dt.strftime("%Y//%m//%d")'2021//10//01'dt.strftime("%Y-%m-%d %H:%M")'2021-10-01 00:00'dt.strftime("%A, %d. %B %Y %I:%M%p")'Friday, 01. October 2021 12:00AM'
?
date.__format__(format)
與 date.strftime()?相同。此方法使得為 date 對象指定以?格式化字符串字面值?表示的格式化字符串以及使用 str.format()?進(jìn)行格式化成為可能。雖然不建議使用這個裝逼,但是遇到別人裝逼的時候我們得知道。要獲取格式指令的完整列表,請看文末附表
import datetimedt=datetime.date(2021, 10, 1)#創(chuàng)建一個日期對象dt.__format__("%Y年%m月%d日")'2021年10月01日'
?
4、支持的運(yùn)算
date2?=?date1?+?timedelta | date2 等于從 date1 減去 timedelta.days 天。(1) |
date2?=?date1?-?timedelta | 計(jì)算 date2 的值使得 date2 + timedelta == date1。(2) |
timedelta?=?date1?-?date2 | (3) |
date1?<?date2 | 如果 date1 的時間在 date2 之前則認(rèn)為 date1 小于 date2 。(4) |
···? END? ···一、Number(數(shù)字)全面掌握Python基礎(chǔ),這一篇就夠了,建議收藏Python基礎(chǔ)之?dāng)?shù)字(Number)超級詳解
Python隨機(jī)模塊22個函數(shù)詳解
Python數(shù)學(xué)math模塊55個函數(shù)詳解二、String(字符串)Python字符串的45個方法詳解
Pandas向量化字符串操作三、List(列表)超級詳解系列-Python列表全面解析
Python輕量級循環(huán)-列表推導(dǎo)式四、Tuple(元組)Python的元組,沒想象的那么簡單五、Set(集合)全面理解Python集合,17個方法全解,看完就夠了六、Dictionary(字典)Python字典詳解-超級完整版七、內(nèi)置函數(shù)Python初學(xué)者必須吃透這69個內(nèi)置函數(shù)!八、正則模塊
Python正則表達(dá)式入門到入魔
筆記 | 史上最全的正則表達(dá)式八、系統(tǒng)操作Python之shutil模塊11個常用函數(shù)詳解Python之OS模塊39個常用函數(shù)詳解九、進(jìn)階模塊
【萬字長文詳解】Python庫collections,讓你擊敗99%的Pythoner
高手如何在Python中使用collections模塊↓掃描關(guān)注本號↓
