1. datetime:日期和時間值管理
datetime包含一些函式和類,用于完成日期和時間的決議、格式化和算術運算,
1.1 時間
時間值用time類表示,time實體包含hour、minute、second和microsecond屬性,還可以包含時區資訊,
import datetime t = datetime.time(1, 2, 3) print(t) print('hour :', t.hour) print('minute :', t.minute) print('second :', t.second) print('microsecond:', t.microsecond) print('tzinfo :', t.tzinfo)
初始化time實體的引數是可選的,但默認值0不太可能是正確的,

time實體只包含時間值,而不包含與時間相關的日期值,
import datetime print('Earliest :', datetime.time.min) print('Latest :', datetime.time.max) print('Resolution:', datetime.time.resolution)
min和max類屬性可以反映一天中的合法時間范圍,

time的解析度被限制為整微秒值,
import datetime for m in [1, 0, 0.1, 0.6]: try: print('{:02.1f} :'.format(m), datetime.time(0, 0, 0, microsecond=m)) except TypeError as err: print('ERROR:', err)
如果微秒為浮點值,則其會產生一個TypeError,

1.2 日期
日歷日期值用date類表示,date實體包含year、month和day屬性,使用today()類方法很容易創建一個當前日期的日期實體,
import datetime today = datetime.date.today() print(today) print('ctime :', today.ctime()) tt = today.timetuple() print('tuple : tm_year =', tt.tm_year) print(' tm_mon =', tt.tm_mon) print(' tm_mday =', tt.tm_mday) print(' tm_hour =', tt.tm_hour) print(' tm_min =', tt.tm_min) print(' tm_sec =', tt.tm_sec) print(' tm_wday =', tt.tm_wday) print(' tm_yday =', tt.tm_yday) print(' tm_isdst =', tt.tm_isdst) print('ordinal:', today.toordinal()) print('Year :', today.year) print('Mon :', today.month) print('Day :', today.day)
下面這個例子采用多種不同格式來列印當前日期,

還有一些類方法可以由POSIX時間戳或Gregorian日歷中表示日期值的整數(第1年的1月1日對應的值為1,以后每天對應的值逐個加1)來創建date實體,
import datetime import time o = 733114 print('o :', o) print('fromordinal(o) :', datetime.date.fromordinal(o)) t = time.time() print('t :', t) print('fromtimestamp(t):', datetime.date.fromtimestamp(t))
這個例子表明fromordinal()和fromtimestamp()使用了不同的值型別,

與time類類似,可以使用min和max屬性確定所支持的日期值范圍,
import datetime print('Earliest :', datetime.date.min) print('Latest :', datetime.date.max) print('Resolution:', datetime.date.resolution)
日期的解析度為整天,

創建新的date實體還有一種方法,可以使用現有日期的replace()方法來創建,
import datetime d1 = datetime.date(2008, 3, 29) print('d1:', d1.ctime()) d2 = d1.replace(year=2009) print('d2:', d2.ctime())

1.3 timedelta
通過對兩個datetime物件完成算術運算,或者結合使用datetime和timedelta,可以計算出將來和過去的日期,將兩個日期相減可以生成一個timedelta,還可以對某個日期增加或減去一個timedelta來生成另一個日期,timedelta的內部值按日、秒和微秒存盤,
import datetime print('microseconds:', datetime.timedelta(microseconds=1)) print('milliseconds:', datetime.timedelta(milliseconds=1)) print('seconds :', datetime.timedelta(seconds=1)) print('minutes :', datetime.timedelta(minutes=1)) print('hours :', datetime.timedelta(hours=1)) print('days :', datetime.timedelta(days=1)) print('weeks :', datetime.timedelta(weeks=1))
傳入建構式的中間值會被轉換為日、秒和微秒,

一個timedelta的完整時間段可以使用total_seconds()得到,并作為一個秒表回傳,
import datetime for delta in [datetime.timedelta(microseconds=1), datetime.timedelta(milliseconds=1), datetime.timedelta(seconds=1), datetime.timedelta(minutes=1), datetime.timedelta(hours=1), datetime.timedelta(days=1), datetime.timedelta(weeks=1), ]: print('{:15} = {:8} seconds'.format( str(delta), delta.total_seconds()) )
回傳值是一個浮點數,因為有些時間段不到1秒,

1.4 日期算術運算
日期算術運算使用標準算術運算子來完成,
import datetime today = datetime.date.today() print('Today :', today) one_day = datetime.timedelta(days=1) print('One day :', one_day) yesterday = today - one_day print('Yesterday:', yesterday) tomorrow = today + one_day print('Tomorrow :', tomorrow) print() print('tomorrow - yesterday:', tomorrow - yesterday) print('yesterday - tomorrow:', yesterday - tomorrow)
這個處理日期物件的例子展示了如何使用timedelta物件計算新日期,另外,這里將日期實體相減來生成timedelta(包括一個負差異值),

timedelta物件還支持與整數、浮點數和其他timedelta實體的算術運算,
import datetime one_day = datetime.timedelta(days=1) print('1 day :', one_day) print('5 days :', one_day * 5) print('1.5 days :', one_day * 1.5) print('1/4 day :', one_day / 4) # assume an hour for lunch work_day = datetime.timedelta(hours=7) meeting_length = datetime.timedelta(hours=1) print('meetings per day :', work_day / meeting_length)
在這個例子中,計算了一天的多個倍數,得到的timedelta包含相應的天數或小時數,
最后這個例子展示了如何結合兩個timedelta物件來計算值,在這里,結果是一個浮點數,

1.5 比較值
日期和時間值都可以使用標準比較運算子來比較,從而確定哪一個在前,哪一個在后,
import datetime import time print('Times:') t1 = datetime.time(12, 55, 0) print(' t1:', t1) t2 = datetime.time(13, 5, 0) print(' t2:', t2) print(' t1 < t2:', t1 < t2) print() print('Dates:') d1 = datetime.date.today() print(' d1:', d1) d2 = datetime.date.today() + datetime.timedelta(days=1) print(' d2:', d2) print(' d1 > d2:', d1 > d2)
支持所有比較運算子,

1.6 結合日期和時間
使用datetime類可以存盤由日期和時間分量構成的值,類似于date,可以使用很多便利的類方法來從其他常用值創建datetime實體,
import datetime print('Now :', datetime.datetime.now()) print('Today :', datetime.datetime.today()) print('UTC Now:', datetime.datetime.utcnow()) print() FIELDS = [ 'year', 'month', 'day', 'hour', 'minute', 'second', 'microsecond', ] d = datetime.datetime.now() for attr in FIELDS: print('{:15}: {}'.format(attr, getattr(d, attr)))
可以想見,datetime實體包含date和time物件的所有屬性,

與date類似,datetime提供了便利的類方法來創建新實體,它還包括fromordinal()和fromtimestamp(),
import datetime t = datetime.time(1, 2, 3) print('t :', t) d = datetime.date.today() print('d :', d) dt = datetime.datetime.combine(d, t) print('dt:', dt)
利用combine(),可以由一個date實體和一個time實體創建一個datetime實體,

1.7 格式化和決議
datetime物件的默認字串表示使用ISO-8601格式(YYYY-MM-DDTHH:MM:SS.mmmmmm),可以使用strftime()生成其他格式,
import datetime format = "%a %b %d %H:%M:%S %Y" today = datetime.datetime.today() print('ISO :', today) s = today.strftime(format) print('strftime:', s) d = datetime.datetime.strptime(s, format) print('strptime:', d.strftime(format))
使用datetime.strptime()可以將格式化的字串轉換為datetime實體,

還可以對Python的字串格式化微語言使用同樣的格式化代碼,只需要把這些格式化放在格式化字串欄位規范的 : 后面,
import datetime today = datetime.datetime.today() print('ISO :', today) print('format(): {:%a %b %d %H:%M:%S %Y}'.format(today))
每個datetime格式化代碼都必須有%前綴,后面的冒號會作為字面量字符包含在輸出中,

strptime/strftime格式化代碼:
| 符號 | 含義 | 例 |
|---|---|---|
%a |
星期幾的縮寫 | 'Wed' |
%A |
作業日全名 | 'Wednesday' |
%w |
作業日編號– 0(星期日)至6(星期六) | '3' |
%d |
每月的某天(零填充) | '13' |
%b |
縮寫的月份名稱 | 'Jan' |
%B |
月份全稱 | 'January' |
%m |
一年中的月份 | '01' |
%y |
沒有世紀的年份 | '16' |
%Y |
百年紀念 | '2016' |
%H |
從24小時制開始的小時數 | '17' |
%I |
從12小時制開始的小時數 | '05' |
%p |
上午下午 | 'PM' |
%M |
分鐘 | '00' |
%S |
秒 | '00' |
%f |
微秒 | '000000' |
%z |
時區感知物件的UTC偏移量 | '-0500' |
%Z |
時區名稱 | 'EST' |
%j |
一年中的一天 | '013' |
%W |
一年中的第幾周 | '02' |
%c |
當前語言環境的日期和時間表示 | 'Wed Jan 13 17:00:00 2016' |
%x |
當前語言環境的日期表示 | '01/13/16' |
%X |
當前語言環境的時間表示 | '17:00:00' |
%% |
文字%字符 |
'%' |
1.8 時區
在datetime中,時區由tzinfo的子類表示,由于tzinfo是一個抽象基類,實際使用時,應用需要定義它的一個子類,并為一些方法提供適當的實作,
datetime在類timezone中確實包含一個原生實作,該類使用了一個固定的UTC偏移,這個實作不支持一年中不同日期有不同的偏移值,如有些地方采用夏令時,或者有些地方UTC偏移會隨時間改變,
import datetime min6 = datetime.timezone(datetime.timedelta(hours=-6)) plus6 = datetime.timezone(datetime.timedelta(hours=6)) d = datetime.datetime.now(min6) print(min6, ':', d) print(datetime.timezone.utc, ':', d.astimezone(datetime.timezone.utc)) print(plus6, ':', d.astimezone(plus6)) # convert to the current system timezone d_system = d.astimezone() print(d_system.tzinfo, ' :', d_system)
要把一個datetime值從一個時區轉換為另一個時區,可以使用astimezone(),在前面的例子中,顯示了UTC兩側正負6小時的兩個不同時區,另外還使用了由datetime.timezone得到的utc實體來作為參考,最后的輸出行顯示了系統時區的值,這是不提供任何引數呼叫astimezone()得到的,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/185250.html
標籤:Python
下一篇:LogisticRegression_邏輯回歸 / 對率回歸與三種優化方法(梯度下降法 / 牛頓法 / 擬牛頓法 與 python實作
