<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python時(shí)間模塊,超實(shí)用總結(jié)!

          共 4444字,需瀏覽 9分鐘

           ·

          2020-08-30 10:26


          我的施工之路


          ? ?施工之路已完成13篇圖文,又提煉為思維導(dǎo)圖,結(jié)合使用,效果最佳。

          1我的施工計(jì)劃

          2數(shù)字專題

          3字符串專題

          4列表專題

          5流程控制專題

          6編程風(fēng)格專題

          7函數(shù)使用

          8面向?qū)ο缶幊?上篇)

          9面向?qū)ο缶幊?下篇)

          10十大數(shù)據(jù)結(jié)構(gòu)

          11包和模塊使用總結(jié)

          12Python 正則使用專題總結(jié)?

          13設(shè)計(jì)模式專題

          今天是Python時(shí)間模塊核心使用邏輯。本篇思維導(dǎo)圖如下:

          Python內(nèi)置一個(gè)時(shí)間模塊datetime,提供我們關(guān)于時(shí)間的表達(dá)。記錄時(shí)間無所不在,日志文件,程序運(yùn)行起始時(shí)間和時(shí)長(zhǎng),銷量預(yù)測(cè)的特征等等,我們都能看到時(shí)間的身影。

          這篇專題總結(jié)datetime模塊最主要用法,希望通過此文,大家使用那些時(shí)間處理的常用API時(shí),能信手拈來,不用help函數(shù),不用搜索。

          1 核心邏輯

          datetime模塊提供日期和時(shí)間各自分類的對(duì)象,日期處理相關(guān)的對(duì)象date,時(shí)間處理相關(guān)的time,日期和時(shí)間的完整結(jié)合對(duì)象datetime.

          日期和時(shí)間的加減操作得到timedelta對(duì)象.

          此時(shí)此刻 2020-8-28 21:45,這個(gè)時(shí)間是本地時(shí)間,很明顯紐約時(shí)間肯定不是此值,柏林時(shí)間也肯定不是這個(gè)值。Python為支持不同地區(qū)的時(shí)間表達(dá),特意抽象出tzinfo對(duì)象,并有一個(gè)默認(rèn)實(shí)現(xiàn)對(duì)象.

          以上就是datetime模塊的幾個(gè)核心對(duì)象以及對(duì)應(yīng)的現(xiàn)實(shí)意義。

          2 date、time和datetime對(duì)象

          下面介紹最基本3個(gè)對(duì)象的最基本用法。首先,從datetime模塊導(dǎo)入3個(gè)對(duì)象

          In?[1]:?from?datetime?import?date,time,datetime???????????

          構(gòu)造一個(gè)日期date實(shí)例,2020年9月1日:

          In?[2]:?date(2020,9,1)??????????????????????????????????????????????????????????
          Out[2]:?datetime.date(2020,?9,?1)

          構(gòu)造一個(gè)時(shí)間time實(shí)例,10點(diǎn)10分0秒:

          In?[3]:?time(10,10,0)???????????????????????????????????????????????????????????
          Out[3]:?datetime.time(10,?10)

          構(gòu)造一個(gè)日期+時(shí)間的完整datetime實(shí)例,2020年9月1日 10點(diǎn)10分0秒:

          In?[4]:?datetime(2020,9,1,10,10,10)?????????????????????????????????????????????
          Out[4]:?datetime.datetime(2020,?9,?1,?10,?10,?10)

          自己構(gòu)造時(shí)間沒什么意義,更有意義的是打印當(dāng)前時(shí)間,比如此時(shí)程序啟動(dòng)打印下時(shí)間,如果程序可能運(yùn)行十幾天,很明顯使用日期+時(shí)間的完整datetime實(shí)例。

          此方法歸屬于datetime類上的方法,所以無須構(gòu)造datetime實(shí)例,直接如下:

          datetime.today()?#?datetime類的today方法
          Out[5]:?datetime.datetime(2020,?8,?28,?22,?0,?47,?439509)

          打印結(jié)果顯示年月日時(shí)分秒毫秒 還可以使用類方法now:

          In?[6]:?datetime.now()??????????????????????????????????????????????????????????
          Out[6]:?datetime.datetime(2020,?8,?28,?22,?1,?28,?737166)

          直接打印當(dāng)前時(shí)間,返回日期+時(shí)間的字符串結(jié)果:

          In?[7]:?print(datetime.now())???????????????????????????
          2020-08-28?22:02:57.217572

          如果我們不想顯示毫秒,這就涉及到日期+時(shí)間的打印格式化問題。使用datetime類方法strftime(string format time),用法如下:

          In?[8]:?datetime.strftime(datetime.now(),'%Y-%m-%d?%H:%M:%S')???????????????????
          Out[8]:?'2020-08-28?22:06:20'

          這就涉及到打印格式化字符,常用的幾個(gè):

          字符意義
          %Y完整的年份
          %y去掉世紀(jì)的年份
          %m月份(01 - 12)
          %d一個(gè)月中的第幾天(01 - 31)
          %H一天中的第幾個(gè)小時(shí)(24小時(shí)制,00 - 23)
          %M分鐘數(shù)(00 - 59)
          %S秒(01 - 61)
          %w一個(gè)星期中的第幾天(0 - 6,0是星期天)
          %Z時(shí)區(qū)的名字(如果不存在為空字符)

          如果讀入一個(gè)時(shí)間列,此時(shí)type為str,為了對(duì)此作時(shí)間運(yùn)算,需要將其轉(zhuǎn)化為datetime,使用strptime(string parse time),它是datetime的類方法:

          In?[11]:?datetime.strptime('2020-08-28?22:06:20','%Y-%m-%d?%H:%M:%S')???????????
          Out[11]:?datetime.datetime(2020,?8,?28,?22,?6,?20)

          字符型日期+時(shí)間要想正確轉(zhuǎn)化為datetime對(duì)象,字符串和格式必須要匹配,否則會(huì)拋錯(cuò):

          In?[13]:?datetime.strptime('2020-08-28?22:06:20',\
          ???????????????????????????'%Y/%m/%d?%H:%M:%S')?

          ValueError:?time?data?'2020-08-28?22:06:20'?
          does?not?match?format?'%Y/%m/%d?%H:%M:%S'

          3 基本運(yùn)算

          有時(shí)需要求偏離某個(gè)時(shí)間的時(shí)間,timedelta對(duì)象能滿足此需求。

          比如,求當(dāng)前時(shí)間的前12小時(shí)的日期+時(shí)間。

          首先,導(dǎo)入timedelta類:

          In?[15]:?from?datetime?import?timedelta???????????????????

          直接使用當(dāng)前時(shí)間減去timedelta表示的12小時(shí)長(zhǎng)度,注意第一個(gè)參數(shù)的含義為days,所以除以 24:

          In?[16]:?datetime.now()?-?timedelta(12/24)??????????????????????????????????????
          Out[16]:?datetime.datetime(2020,?8,?28,?10,?22,?44,?287246)

          由上面這個(gè)用法,可以總結(jié)為:

          datetime1 - timedelta1 = datetime2

          所以 datetime1 - datetime2 = timedelta1,故兩個(gè)時(shí)間相減得到timedelta類型的實(shí)例。

          除此之外,還有一個(gè)小方法,可能會(huì)用到,就是datetime類上的combine方法,它能組合date實(shí)例和time實(shí)例為datetime實(shí)例,如下所示:

          In?[17]:?datetime.combine(date(2020,9,1),time(10,10,0))?????????????????????????
          Out[17]:?datetime.datetime(2020,?9,?1,?10,?10)

          4 關(guān)于tzinfo

          為了更好統(tǒng)一全球時(shí)間,世界規(guī)定了一個(gè)UTC時(shí)間,即全球統(tǒng)一時(shí)間,比如假設(shè)與之相比北京時(shí)間比它早8小時(shí),曼谷比它早7小時(shí)等。

          比如打印當(dāng)前時(shí)間時(shí),

          ```python
          In?[6]:?print(datetime.now())
          2020-08-28?22:33:35.393709???????????????????????????

          以上顯示的這個(gè)時(shí)間,其實(shí)并不完整,我當(dāng)然明白它是我所在地的時(shí)間,但是其他國(guó)家的開發(fā)者看到這個(gè)時(shí)間時(shí),或許以為是UTC標(biāo)準(zhǔn)下的時(shí)間。若是這樣解讀,顯然會(huì)和實(shí)際有一個(gè)時(shí)差問題。

          有的讀者會(huì)說,我在打印格式化時(shí)添加時(shí)區(qū)信息可以嗎,我們實(shí)驗(yàn)一下:

          In?[19]:?datetime.strftime(datetime.now(),\
          ???????????????????????????'%Y-%m-%d?%H:%M:%S?%Z')???????????????
          Out[19]:?'2020-08-28?22:39:44?'

          時(shí)區(qū)信息為空,所以沒能解決問題。之所以時(shí)區(qū)信息會(huì)為空,是因?yàn)閐atetime.now()時(shí)未給定tzinfo值。

          所以,我們需要自己重新定義一個(gè)tzinfo,即實(shí)現(xiàn)一個(gè)tzinfo對(duì)象。

          此類BJinfo繼承tzinfo,然后實(shí)現(xiàn)其中的3個(gè)方法:

          from?datetime?import?tzinfo

          class?BJinfo(tzinfo):
          ????"""BJinfo"""
          ????def?utcoffset(self,?dt):
          ????????return?timedelta(hours=8)

          ????def?tzname(self,?dt):
          ????????return?"UTC?8"

          ????def?dst(self,?dt):
          ????????return?timedelta(hours=8)

          此時(shí)再打印當(dāng)前時(shí)間時(shí),賦上tzinfo值:

          nowt?=?datetime.now(tz=BJinfo())
          In?[32]:?In?[6]:?print(nowt)???????????????????????????????
          2020-08-28?22:52:20.328446+08:00

          再格式化打印時(shí)區(qū)信息:

          In?[36]:?datetime.strftime(nowt,\?
          ????...:?????'%Y-%m-%d?%H:%M:%S?%Z')?????????????????????
          Out[36]:?'2020-08-28?22:52:20?UTC?8'

          透過時(shí)區(qū)信息BJinfo 定義的三個(gè)方法,便能確認(rèn)時(shí)間2020-08-28 22:52:20是比UTC快8個(gè)小時(shí)的時(shí)區(qū)下,所對(duì)應(yīng)的一個(gè)時(shí)間。

          總結(jié)

          以上就是本專題對(duì)datetime模塊核心對(duì)象的使用總結(jié),大綱如下:

          • 1 核心邏輯

          • 2 date、time和datetime對(duì)象

          • 3 基本運(yùn)算

          • 4 關(guān)于tzinfo

          • 總結(jié)

          全部手寫,完全原創(chuàng)。若覺得有幫助,歡迎給個(gè)在看、點(diǎn)個(gè)贊,漫長(zhǎng)施工之路上,我會(huì)更有動(dòng)力堅(jiān)持下去,謝謝。

          Python與算法社區(qū)

          寫了400+篇原創(chuàng)的技術(shù)號(hào)

          瀏覽 65
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品视频在线免费 | 天天综合三区 | 亚洲激情四射婷婷 | 三级片在线视频观看 | 九九免费视屏 |